{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import datetime\n",
    "import random\n",
    "import time\n",
    "from bisect import bisect_left\n",
    "from enum import Enum\n",
    "from math import exp"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "class FieldContents(Enum):\n",
    "    Grass = ' #'\n",
    "    Mowed = ' .'\n",
    "    Mower = 'M'\n",
    "\n",
    "    def __str__(self):\n",
    "        return self.value\n",
    "\n",
    "\n",
    "class Direction:\n",
    "    def __init__(self, index, xOffset, yOffset, symbol):\n",
    "        self.Index = index\n",
    "        self.XOffset = xOffset\n",
    "        self.YOffset = yOffset\n",
    "        self.Symbol = symbol\n",
    "\n",
    "    def move_from(self, location, distance=1):\n",
    "        return Location(location.X + distance * self.XOffset,\n",
    "                        location.Y + distance * self.YOffset)\n",
    "\n",
    "\n",
    "class Directions(Enum):\n",
    "    North = Direction(0, 0, -1, '^')\n",
    "    East = Direction(1, 1, 0, '>')\n",
    "    South = Direction(2, 0, 1, 'v')\n",
    "    West = Direction(3, -1, 0, '<')\n",
    "\n",
    "    @staticmethod\n",
    "    def get_direction_after_turn_left_90_degrees(direction):\n",
    "        newIndex = direction.Index - 1 \\\n",
    "            if direction.Index > 0 \\\n",
    "            else len(Directions) - 1\n",
    "        newDirection = next(i for i in Directions\n",
    "                            if i.value.Index == newIndex)\n",
    "        return newDirection.value\n",
    "\n",
    "    @staticmethod\n",
    "    def get_direction_after_turn_right_90_degrees(direction):\n",
    "        newIndex = direction.Index + 1 \\\n",
    "            if direction.Index < len(Directions) - 1 \\\n",
    "            else 0\n",
    "        newDirection = next(i for i in Directions\n",
    "                            if i.value.Index == newIndex)\n",
    "        return newDirection.value\n",
    "\n",
    "\n",
    "class Location:\n",
    "    def __init__(self, x, y):\n",
    "        self.X, self.Y = x, y\n",
    "\n",
    "    def move(self, xOffset, yOffset):\n",
    "        return Location(self.X + xOffset,\n",
    "                        self.Y + yOffset)\n",
    "\n",
    "\n",
    "class Mower:\n",
    "    def __init__(self, location, direction):\n",
    "        self.Location = location\n",
    "        self.Direction = direction\n",
    "        self.StepCount = 0\n",
    "\n",
    "    def turn_left(self):\n",
    "        self.StepCount += 1\n",
    "        self.Direction = Directions\\\n",
    "            .get_direction_after_turn_left_90_degrees(self.Direction)\n",
    "\n",
    "    def mow(self, field):\n",
    "        newLocation = self.Direction.move_from(self.Location)\n",
    "        newLocation, isValid = field.fix_location(newLocation)\n",
    "        if isValid:\n",
    "            self.Location = newLocation\n",
    "            self.StepCount += 1\n",
    "            field.set(self.Location, self.StepCount\n",
    "                if self.StepCount > 9\n",
    "                else \" {}\".format(self.StepCount))\n",
    "\n",
    "    def jump(self, field, forward, right):\n",
    "        newLocation = self.Direction.move_from(self.Location, forward)\n",
    "        rightDirection = Directions\\\n",
    "            .get_direction_after_turn_right_90_degrees(self.Direction)\n",
    "        newLocation = rightDirection.move_from(newLocation, right)\n",
    "        newLocation, isValid = field.fix_location(newLocation)\n",
    "        if isValid:\n",
    "            self.Location = newLocation\n",
    "            self.StepCount += 1\n",
    "            field.set(self.Location, self.StepCount\n",
    "                if self.StepCount > 9\n",
    "                else \" {}\".format(self.StepCount))\n",
    "\n",
    "\n",
    "class Field:\n",
    "    def __init__(self, width, height, initialContent):\n",
    "        self.Field = [[initialContent] * width for _ in range(height)]\n",
    "        self.Width = width\n",
    "        self.Height = height\n",
    "\n",
    "    def set(self, location, symbol):\n",
    "        self.Field[location.Y][location.X] = symbol\n",
    "\n",
    "    def count_mowed(self):\n",
    "        return sum(1 for row in range(self.Height)\n",
    "                   for column in range(self.Width)\n",
    "                   if self.Field[row][column] != FieldContents.Grass)\n",
    "\n",
    "    def display(self, mower):\n",
    "        for rowIndex in range(self.Height):\n",
    "            if rowIndex != mower.Location.Y:\n",
    "                row = ' '.join(map(str, self.Field[rowIndex]))\n",
    "            else:\n",
    "                r = self.Field[rowIndex][:]\n",
    "                r[mower.Location.X] = \"{}{}\".format(\n",
    "                    FieldContents.Mower, mower.Direction.Symbol)\n",
    "                row = ' '.join(map(str, r))\n",
    "            print(row)\n",
    "\n",
    "\n",
    "class ValidatingField(Field):\n",
    "    def __init__(self, width, height, initialContent):\n",
    "        super().__init__(width, height, initialContent)\n",
    "\n",
    "    def fix_location(self, location):\n",
    "        if location.X >= self.Width or \\\n",
    "                        location.X < 0 or \\\n",
    "                        location.Y >= self.Height or \\\n",
    "                        location.Y < 0:\n",
    "            return None, False\n",
    "        return location, True\n",
    "\n",
    "\n",
    "class ToroidField(Field):\n",
    "    def __init__(self, width, height, initialContent):\n",
    "        super().__init__(width, height, initialContent)\n",
    "\n",
    "    def fix_location(self, location):\n",
    "        newLocation = Location(location.X, location.Y)\n",
    "        if newLocation.X < 0:\n",
    "            newLocation.X += self.Width\n",
    "        elif newLocation.X >= self.Width:\n",
    "            newLocation.X %= self.Width\n",
    "\n",
    "        if newLocation.Y < 0:\n",
    "            newLocation.Y += self.Height\n",
    "        elif newLocation.Y >= self.Height:\n",
    "            newLocation.Y %= self.Height\n",
    "\n",
    "        return newLocation, True"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "class Mow:\n",
    "    def __init__(self):\n",
    "        pass\n",
    "\n",
    "    @staticmethod\n",
    "    def execute(mower, field):\n",
    "        mower.mow(field)\n",
    "\n",
    "    def __str__(self):\n",
    "        return \"移动\"\n",
    "\n",
    "\n",
    "class Turn:\n",
    "    def __init__(self):\n",
    "        pass\n",
    "\n",
    "    @staticmethod\n",
    "    def execute(mower, field):\n",
    "        mower.turn_left()\n",
    "\n",
    "    def __str__(self):\n",
    "        return \"|转弯|\"\n",
    "\n",
    "\n",
    "class Jump:\n",
    "    def __init__(self, forward, right):\n",
    "        self.Forward = forward\n",
    "        self.Right = right\n",
    "\n",
    "    def execute(self, mower, field):\n",
    "        mower.jump(field, self.Forward, self.Right)\n",
    "\n",
    "    def __str__(self):\n",
    "        return \"jump({},{})\".format(self.Forward, self.Right)\n",
    "\n",
    "\n",
    "class Repeat:\n",
    "    def __init__(self, opCount, times):\n",
    "        self.OpCount = opCount\n",
    "        self.Times = times\n",
    "        self.Ops = []\n",
    "\n",
    "    def execute(self, mower, field):\n",
    "        for i in range(self.Times):\n",
    "            for op in self.Ops:\n",
    "                op.execute(mower, field)\n",
    "\n",
    "    def __str__(self):\n",
    "        return \"repeat({},{})\".format(\n",
    "            ' '.join(map(str, self.Ops))\n",
    "            if len(self.Ops) > 0\n",
    "            else self.OpCount,\n",
    "            self.Times)\n",
    "\n",
    "\n",
    "class Func:\n",
    "    def __init__(self, expectCall=False):\n",
    "        self.Ops = []\n",
    "        self.ExpectCall = expectCall\n",
    "        self.Id = None\n",
    "\n",
    "    def execute(self, mower, field):\n",
    "        for op in self.Ops:\n",
    "            op.execute(mower, field)\n",
    "\n",
    "    def __str__(self):\n",
    "        return \"func{1}: {0}\".format(\n",
    "            ' '.join(map(str, self.Ops)),\n",
    "            self.Id if self.Id is not None else '')\n",
    "\n",
    "\n",
    "class Call:\n",
    "    def __init__(self, funcId=None):\n",
    "        self.FuncId = funcId\n",
    "        self.Funcs = None\n",
    "\n",
    "    def execute(self, mower, field):\n",
    "        funcId = 0 if self.FuncId is None else self.FuncId\n",
    "        if len(self.Funcs) > funcId:\n",
    "            self.Funcs[funcId].execute(mower, field)\n",
    "\n",
    "    def __str__(self):\n",
    "        return \"call-{}\".format(\n",
    "            self.FuncId\n",
    "            if self.FuncId is not None\n",
    "            else 'func')\n",
    "\n",
    "\n",
    "class Program:\n",
    "    def __init__(self, genes):\n",
    "        temp = genes[:]\n",
    "        funcs = []\n",
    "\n",
    "        for index in reversed(range(len(temp))):\n",
    "            if type(temp[index]) is Repeat:\n",
    "                start = index + 1\n",
    "                end = min(index + temp[index].OpCount + 1, len(temp))\n",
    "                temp[index].Ops = temp[start:end]\n",
    "                del temp[start:end]\n",
    "                continue\n",
    "\n",
    "            if type(temp[index]) is Call:\n",
    "                temp[index].Funcs = funcs\n",
    "\n",
    "            if type(temp[index]) is Func:\n",
    "                if len(funcs) > 0 and not temp[index].ExpectCall:\n",
    "                    temp[index] = Call()\n",
    "                    temp[index].Funcs = funcs\n",
    "                    continue\n",
    "                start = index + 1\n",
    "                end = len(temp)\n",
    "                func = Func()\n",
    "                if temp[index].ExpectCall:\n",
    "                    func.Id = len(funcs)\n",
    "                func.Ops = [i for i in temp[start:end]\n",
    "                            if type(i) is not Repeat or\n",
    "                            type(i) is Repeat and len(i.Ops) > 0\n",
    "                            ]\n",
    "                funcs.append(func)\n",
    "                del temp[index:end]\n",
    "\n",
    "        for func in funcs:\n",
    "            for index in reversed(range(len(func.Ops))):\n",
    "                 if type(func.Ops[index]) is Call:\n",
    "                    func_id = func.Ops[index].FuncId\n",
    "                    if func_id is None:\n",
    "                        continue\n",
    "                    if func_id >= len(funcs) or \\\n",
    "                                    len(funcs[func_id].Ops) == 0:\n",
    "                        del func.Ops[index]\n",
    "\n",
    "        for index in reversed(range(len(temp))):\n",
    "            if type(temp[index]) is Call:\n",
    "                func_id = temp[index].FuncId\n",
    "                if func_id is None:\n",
    "                    continue\n",
    "                if func_id >= len(funcs) or \\\n",
    "                                len(funcs[func_id].Ops) == 0:\n",
    "                    del temp[index]\n",
    "        self.Main = temp\n",
    "        self.Funcs = funcs\n",
    "\n",
    "    def evaluate(self, mower, field):\n",
    "        for i, instruction in enumerate(self.Main):\n",
    "            instruction.execute(mower, field)\n",
    "\n",
    "    def print(self):\n",
    "        if self.Funcs is not None:\n",
    "            for func in self.Funcs:\n",
    "                if func.Id is not None and len(func.Ops) == 0:\n",
    "                    continue\n",
    "                print(func)\n",
    "        print(' '.join(map(str, self.Main)))\n",
    "\n",
    "\n",
    "class Fitness:\n",
    "    def __init__(self, totalMowed, totalInstructions, stepCount):\n",
    "        self.TotalMowed = totalMowed\n",
    "        self.TotalInstructions = totalInstructions\n",
    "        self.StepCount = stepCount\n",
    "\n",
    "    def __gt__(self, other):\n",
    "        if self.TotalMowed != other.TotalMowed:\n",
    "            return self.TotalMowed > other.TotalMowed\n",
    "        if self.StepCount != other.StepCount:\n",
    "            return self.StepCount < other.StepCount\n",
    "        return self.TotalInstructions < other.TotalInstructions\n",
    "\n",
    "    def __str__(self):\n",
    "        return \"{} 次移动  其中{} 次指令  总计 {} 个步骤\".format(\n",
    "            self.TotalMowed, self.TotalInstructions, self.StepCount)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "def _mutate(parent, geneSet, get_fitness):\n",
    "    childGenes = parent.Genes[:]\n",
    "    index = random.randrange(0, len(parent.Genes))\n",
    "    newGene, alternate = random.sample(geneSet, 2)\n",
    "    childGenes[index] = alternate if newGene == childGenes[index] else newGene\n",
    "    fitness = get_fitness(childGenes)\n",
    "    return Chromosome(childGenes, fitness, Strategies.Mutate)\n",
    "\n",
    "\n",
    "def _mutate_custom(parent, custom_mutate, get_fitness):\n",
    "    childGenes = parent.Genes[:]\n",
    "    custom_mutate(childGenes)\n",
    "    fitness = get_fitness(childGenes)\n",
    "    return Chromosome(childGenes, fitness, Strategies.Mutate)\n",
    "\n",
    "\n",
    "def _crossover(parentGenes, index, parents, get_fitness, crossover, mutate,\n",
    "               generate_parent):\n",
    "    donorIndex = random.randrange(0, len(parents))\n",
    "    if donorIndex == index:\n",
    "        donorIndex = (donorIndex + 1) % len(parents)\n",
    "    childGenes = crossover(parentGenes, parents[donorIndex].Genes)\n",
    "    if childGenes is None:\n",
    "        parents[donorIndex] = generate_parent()\n",
    "        return mutate(parents[index])\n",
    "    fitness = get_fitness(childGenes)\n",
    "    return Chromosome(childGenes, fitness, Strategies.Crossover)\n",
    "\n",
    "\n",
    "def get_best(get_fitness, targetLen, optimalFitness, geneSet, display,\n",
    "             custom_mutate=None, custom_create=None, maxAge=None, poolSize=1,\n",
    "             crossover=None, maxSeconds=None):\n",
    "    if custom_mutate is None:\n",
    "        def fnMutate(parent):\n",
    "            return _mutate(parent, geneSet, get_fitness)\n",
    "    else:\n",
    "        def fnMutate(parent):\n",
    "            return _mutate_custom(parent, custom_mutate, get_fitness)\n",
    "\n",
    "    if custom_create is None:\n",
    "        def fnGenerateParent():\n",
    "            return _generate_parent(targetLen, geneSet, get_fitness)\n",
    "    else:\n",
    "        def fnGenerateParent():\n",
    "            genes = custom_create()\n",
    "            return Chromosome(genes, get_fitness(genes), Strategies.Create)\n",
    "\n",
    "    strategyLookup = {\n",
    "        Strategies.Create: lambda p, i, o: fnGenerateParent(),\n",
    "        Strategies.Mutate: lambda p, i, o: fnMutate(p),\n",
    "        Strategies.Crossover: lambda p, i, o:\n",
    "        _crossover(p.Genes, i, o, get_fitness, crossover, fnMutate,\n",
    "                   fnGenerateParent)\n",
    "    }\n",
    "\n",
    "    usedStrategies = [strategyLookup[Strategies.Mutate]]\n",
    "    if crossover is not None:\n",
    "        usedStrategies.append(strategyLookup[Strategies.Crossover])\n",
    "\n",
    "        def fnNewChild(parent, index, parents):\n",
    "            return random.choice(usedStrategies)(parent, index, parents)\n",
    "    else:\n",
    "        def fnNewChild(parent, index, parents):\n",
    "            return fnMutate(parent)\n",
    "\n",
    "    for timedOut, improvement in \\\n",
    "            _get_improvement(fnNewChild, fnGenerateParent, maxAge, poolSize,\n",
    "                             maxSeconds):\n",
    "        if timedOut:\n",
    "            return improvement\n",
    "        display(improvement)\n",
    "        f = strategyLookup[improvement.Strategy]\n",
    "        usedStrategies.append(f)\n",
    "        if not optimalFitness > improvement.Fitness:\n",
    "            return improvement\n",
    "\n",
    "\n",
    "def _get_improvement(new_child, generate_parent, maxAge, poolSize, maxSeconds):\n",
    "    startTime = time.time()\n",
    "    bestParent = generate_parent()\n",
    "    yield maxSeconds is not None and time.time() \\\n",
    "          - startTime > maxSeconds, bestParent\n",
    "    parents = [bestParent]\n",
    "    historicalFitnesses = [bestParent.Fitness]\n",
    "    for _ in range(poolSize - 1):\n",
    "        parent = generate_parent()\n",
    "        if maxSeconds is not None and time.time() - startTime > maxSeconds:\n",
    "            yield True, parent\n",
    "        if parent.Fitness > bestParent.Fitness:\n",
    "            yield False, parent\n",
    "            bestParent = parent\n",
    "            historicalFitnesses.append(parent.Fitness)\n",
    "        parents.append(parent)\n",
    "    lastParentIndex = poolSize - 1\n",
    "    pindex = 1\n",
    "    while True:\n",
    "        if maxSeconds is not None and time.time() - startTime > maxSeconds:\n",
    "            yield True, bestParent\n",
    "        pindex = pindex - 1 if pindex > 0 else lastParentIndex\n",
    "        parent = parents[pindex]\n",
    "        child = new_child(parent, pindex, parents)\n",
    "        if parent.Fitness > child.Fitness:\n",
    "            if maxAge is None:\n",
    "                continue\n",
    "            parent.Age += 1\n",
    "            if maxAge > parent.Age:\n",
    "                continue\n",
    "            index = bisect_left(historicalFitnesses, child.Fitness, 0,\n",
    "                                len(historicalFitnesses))\n",
    "            proportionSimilar = index / len(historicalFitnesses)\n",
    "            if random.random() < exp(-proportionSimilar):\n",
    "                parents[pindex] = child\n",
    "                continue\n",
    "            bestParent.Age = 0\n",
    "            parents[pindex] = bestParent\n",
    "            continue\n",
    "        if not child.Fitness > parent.Fitness:\n",
    "            # same fitness\n",
    "            child.Age = parent.Age + 1\n",
    "            parents[pindex] = child\n",
    "            continue\n",
    "        child.Age = 0\n",
    "        parents[pindex] = child\n",
    "        if child.Fitness > bestParent.Fitness:\n",
    "            bestParent = child\n",
    "            yield False, bestParent\n",
    "            historicalFitnesses.append(bestParent.Fitness)\n",
    "\n",
    "\n",
    "class Chromosome:\n",
    "    def __init__(self, genes, fitness, strategy):\n",
    "        self.Genes = genes\n",
    "        self.Fitness = fitness\n",
    "        self.Strategy = strategy\n",
    "        self.Age = 0\n",
    "\n",
    "\n",
    "class Strategies(Enum):\n",
    "    Create = 0,\n",
    "    Mutate = 1,\n",
    "    Crossover = 2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [],
   "source": [
    "def get_fitness(genes, fnEvaluate):\n",
    "    field, mower, _ = fnEvaluate(genes)\n",
    "    return Fitness(field.count_mowed(), len(genes), mower.StepCount)\n",
    "\n",
    "\n",
    "def display(candidate, startTime, fnEvaluate):\n",
    "    field, mower, program = fnEvaluate(candidate.Genes)\n",
    "    timeDiff = datetime.datetime.now() - startTime\n",
    "    field.display(mower)\n",
    "    print(\"{}\\t{}\".format(\n",
    "        candidate.Fitness,\n",
    "        timeDiff))\n",
    "    program.print()\n",
    "\n",
    "\n",
    "def mutate(genes, geneSet, minGenes, maxGenes, fnGetFitness, maxRounds):\n",
    "    count = random.randint(1, maxRounds)\n",
    "    initialFitness = fnGetFitness(genes)\n",
    "    while count > 0:\n",
    "        count -= 1\n",
    "        if fnGetFitness(genes) > initialFitness:\n",
    "            return\n",
    "\n",
    "        adding = len(genes) == 0 or \\\n",
    "                 (len(genes) < maxGenes and random.randint(0, 5) == 0)\n",
    "        if adding:\n",
    "            genes.append(random.choice(geneSet)())\n",
    "            continue\n",
    "\n",
    "        removing = len(genes) > minGenes and random.randint(0, 50) == 0\n",
    "        if removing:\n",
    "            index = random.randrange(0, len(genes))\n",
    "            del genes[index]\n",
    "            continue\n",
    "\n",
    "        index = random.randrange(0, len(genes))\n",
    "        genes[index] = random.choice(geneSet)()\n",
    "\n",
    "\n",
    "def create(geneSet, minGenes, maxGenes):\n",
    "    numGenes = random.randint(minGenes, maxGenes)\n",
    "    genes = [random.choice(geneSet)() for _ in range(1, numGenes)]\n",
    "    return genes\n",
    "\n",
    "\n",
    "def crossover(parent, otherParent):\n",
    "    childGenes = parent[:]\n",
    "    if len(parent) <= 2 or len(otherParent) < 2:\n",
    "        return childGenes\n",
    "    length = random.randint(1, len(parent) - 2)\n",
    "    start = random.randrange(0, len(parent) - length)\n",
    "    childGenes[start:start + length] = otherParent[start:start + length]\n",
    "    return childGenes\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "def run_with(geneSet, width, height, minGenes, maxGenes,\n",
    "                 expectedNumberOfInstructions, maxMutationRounds,\n",
    "                 fnCreateField, expectedNumberOfSteps):\n",
    "        mowerStartLocation = Location(int(width / 2),\n",
    "                                                int(height / 2))\n",
    "        mowerStartDirection = Directions.South.value\n",
    "\n",
    "        def fnCreate():\n",
    "            return create(geneSet, 1, height)\n",
    "\n",
    "        def fnEvaluate(instructions):\n",
    "            program = Program(instructions)\n",
    "            mower = Mower(mowerStartLocation, mowerStartDirection)\n",
    "            field = fnCreateField()\n",
    "            try:\n",
    "                program.evaluate(mower, field)\n",
    "            except RecursionError:\n",
    "                pass\n",
    "            return field, mower, program\n",
    "\n",
    "        def fnGetFitness(genes):\n",
    "            return get_fitness(genes, fnEvaluate)\n",
    "\n",
    "        startTime = datetime.datetime.now()\n",
    "\n",
    "        def fnDisplay(candidate):\n",
    "            display(candidate, startTime, fnEvaluate)\n",
    "\n",
    "        def fnMutate(child):\n",
    "            mutate(child, geneSet, minGenes, maxGenes, fnGetFitness,\n",
    "                   maxMutationRounds)\n",
    "\n",
    "        optimalFitness = Fitness(width * height,\n",
    "                                 expectedNumberOfInstructions,\n",
    "                                 expectedNumberOfSteps)\n",
    "\n",
    "        best = get_best(fnGetFitness, None, optimalFitness, None,\n",
    "                                fnDisplay, fnMutate, fnCreate, maxAge=None,\n",
    "                                poolSize=10, crossover=crossover)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [],
   "source": [
    "def test_mow_turn():\n",
    "    width = height = 8\n",
    "    geneSet = [lambda: Mow(),\n",
    "                   lambda: Turn()]\n",
    "    minGenes = width * height\n",
    "    maxGenes = int(1.5 * minGenes)\n",
    "    maxMutationRounds = 3\n",
    "    expectedNumberOfInstructions = 78\n",
    "\n",
    "    def fnCreateField():\n",
    "        return ToroidField(width, height,FieldContents.Grass)\n",
    "\n",
    "    run_with(geneSet, width, height, minGenes, maxGenes,\n",
    "                      expectedNumberOfInstructions, maxMutationRounds,\n",
    "                      fnCreateField, expectedNumberOfInstructions)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  # M<  4  #  #  #\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      "3 次移动  其中6 次指令  总计 6 个步骤\t0:00:00\n",
      "移动 |转弯| |转弯| 移动 |转弯| 移动\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  # M^  #\n",
      " #  #  #  #  1  3  4  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      "4 次移动  其中6 次指令  总计 6 个步骤\t0:00:00.001982\n",
      "移动 |转弯| 移动 移动 |转弯| 移动\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      "M>  #  #  #  #  2  3  4\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      "4 次移动  其中5 次指令  总计 5 个步骤\t0:00:00.002930\n",
      "|转弯| 移动 移动 移动 移动\n",
      " #  #  #  #  4 M^  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "5 次移动  其中7 次指令  总计 7 个步骤\t0:00:00.007808\n",
      "移动 移动 移动 移动 |转弯| 移动 |转弯|\n",
      " #  #  #  #  4  #  #  #\n",
      " #  #  #  #  5 M>  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "6 次移动  其中7 次指令  总计 7 个步骤\t0:00:00.010743\n",
      "移动 移动 移动 移动 移动 |转弯| 移动\n",
      " #  #  #  #  4  #  #  #\n",
      " #  #  #  #  5  #  #  #\n",
      " #  #  #  # Mv  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "6 次移动  其中6 次指令  总计 6 个步骤\t0:00:00.013700\n",
      "移动 移动 移动 移动 移动 移动\n",
      " #  #  #  #  4  #  #  #\n",
      " #  #  #  #  5  #  #  #\n",
      " #  #  #  #  6  #  #  #\n",
      " #  #  #  # Mv  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "7 次移动  其中7 次指令  总计 7 个步骤\t0:00:00.015617\n",
      "移动 移动 移动 移动 移动 移动 移动\n",
      " #  #  #  #  4  #  #  #\n",
      " #  #  #  #  5  #  #  #\n",
      " #  #  #  #  6  #  #  #\n",
      " #  #  #  #  7  #  #  #\n",
      " #  #  #  # Mv  #  #  #\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "8 次移动  其中8 次指令  总计 8 个步骤\t0:00:00.021474\n",
      "移动 移动 移动 移动 移动 移动 移动 移动\n",
      " #  #  #  #  4  #  #  #\n",
      "M>  #  #  #  5  7  8  9\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "9 次移动  其中10 次指令  总计 10 个步骤\t0:00:00.122003\n",
      "移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动\n",
      " #  #  #  #  4  #  #  #\n",
      "10 M>  #  #  5  7  8  9\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "10 次移动  其中11 次指令  总计 11 个步骤\t0:00:00.145458\n",
      "移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动\n",
      " #  #  #  #  4  #  #  #\n",
      "10 11 M>  #  5  7  8  9\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "11 次移动  其中12 次指令  总计 12 个步骤\t0:00:00.149328\n",
      "移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动\n",
      " #  #  #  #  4  #  #  #\n",
      " #  #  #  #  5  #  #  #\n",
      " #  #  #  #  6  #  #  #\n",
      " #  #  #  #  7  #  #  #\n",
      "M>  #  #  #  8 10 11 12\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "12 次移动  其中13 次指令  总计 13 个步骤\t0:00:00.183514\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动\n",
      " #  #  #  #  4  #  #  #\n",
      " #  #  #  #  5  #  #  #\n",
      " #  #  #  #  6  #  # M^\n",
      " #  #  #  #  7  #  # 14\n",
      " #  #  #  #  8 10 11 12\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "13 次移动  其中15 次指令  总计 15 个步骤\t0:00:00.206911\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动\n",
      " #  #  #  #  4  #  #  #\n",
      " #  #  #  #  5  #  #  #\n",
      " #  #  #  #  6  #  #  #\n",
      " #  #  #  #  7  #  #  #\n",
      "13 M>  #  #  8 10 11 12\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "13 次移动  其中14 次指令  总计 14 个步骤\t0:00:00.218625\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动\n",
      " #  #  #  #  4  #  #  #\n",
      " #  #  #  #  5  #  #  #\n",
      " #  #  #  #  6  #  #  #\n",
      " #  #  #  #  7  #  #  #\n",
      "13 14 M>  #  8 10 11 12\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "14 次移动  其中15 次指令  总计 15 个步骤\t0:00:00.224480\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动\n",
      " #  #  #  #  4  #  #  #\n",
      " #  #  #  #  5  #  #  #\n",
      " #  #  #  #  6  #  #  #\n",
      " #  # M^  #  7  #  #  #\n",
      "13 14 15  #  8 10 11 12\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "15 次移动  其中17 次指令  总计 17 个步骤\t0:00:00.229360\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动\n",
      " #  #  #  #  4  #  #  #\n",
      " #  #  #  #  5  #  #  #\n",
      " #  #  #  #  6  #  #  #\n",
      " #  #  #  #  7  #  #  #\n",
      "13 14 15 M>  8 10 11 12\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "15 次移动  其中16 次指令  总计 16 个步骤\t0:00:00.234242\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动\n",
      " #  #  #  #  4  #  #  #\n",
      " #  #  #  #  5  #  #  #\n",
      " #  # M^  #  6  #  #  #\n",
      " #  # 17  #  7  #  #  #\n",
      "13 14 15  #  8 10 11 12\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "16 次移动  其中18 次指令  总计 18 个步骤\t0:00:00.280144\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动\n",
      " #  #  #  #  4  #  #  #\n",
      " #  #  #  #  5  #  #  #\n",
      " # M< 18  #  6  #  #  #\n",
      " #  # 17  #  7  #  #  #\n",
      "13 14 15  #  8 10 11 12\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "17 次移动  其中20 次指令  总计 20 个步骤\t0:00:00.294779\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 |转弯| 移动\n",
      " #  #  #  #  4  #  #  #\n",
      " #  #  #  #  5  #  #  #\n",
      " #  #  # M^  6  #  #  #\n",
      " #  #  # 18  7  #  #  #\n",
      "13 14 15 16  8 10 11 12\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "17 次移动  其中19 次指令  总计 19 个步骤\t0:00:00.333805\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动\n",
      " #  #  #  #  4  #  #  #\n",
      " #  #  # M^  5  #  #  #\n",
      " #  #  # 19  6  #  #  #\n",
      " #  #  # 18  7  #  #  #\n",
      "13 14 15 16  8 10 11 12\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "18 次移动  其中20 次指令  总计 20 个步骤\t0:00:00.343585\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动\n",
      " #  #  # M^  4  #  #  #\n",
      " #  #  # 20  5  #  #  #\n",
      " #  #  # 19  6  #  #  #\n",
      " #  #  # 18  7  #  #  #\n",
      "13 14 15 16  8 10 11 12\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "19 次移动  其中21 次指令  总计 21 个步骤\t0:00:00.345546\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动\n",
      " #  #  # 21  4  #  #  #\n",
      " #  #  # 20  5  #  #  #\n",
      " #  #  # 19  6  #  #  #\n",
      " #  #  # 18  7  #  #  #\n",
      "13 14 15 16  8 10 11 12\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  # M^  3  #  #  #\n",
      "20 次移动  其中22 次指令  总计 22 个步骤\t0:00:00.379693\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动\n",
      " #  #  #  #  4  #  #  #\n",
      " #  #  #  #  5  #  #  #\n",
      "21 20 18  #  6 M< 23 22\n",
      " #  # 17  #  7  #  #  #\n",
      "13 14 15  #  8 10 11 12\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "21 次移动  其中24 次指令  总计 24 个步骤\t0:00:00.406014\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 |转弯| 移动 移动 移动 移动 移动\n",
      " #  #  # 21  4  #  #  #\n",
      " #  #  # 20  5  #  #  #\n",
      " #  #  # 19  6  #  #  #\n",
      " #  #  # 18  7  #  #  #\n",
      "13 14 15 16  8 10 11 12\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  # M^  2  #  #  #\n",
      " #  #  # 22  3  #  #  #\n",
      "21 次移动  其中23 次指令  总计 23 个步骤\t0:00:00.441179\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动\n",
      " #  #  #  #  4  #  #  #\n",
      "22 21 20 18  5 M< 24 23\n",
      " #  #  # 17  6  #  #  #\n",
      "12 13 14 15  7  9 10 11\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "22 次移动  其中25 次指令  总计 25 个步骤\t0:00:00.548510\n",
      "移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动\n",
      " #  #  # 21  4  #  #  #\n",
      " #  #  # 20  5  #  #  #\n",
      " #  #  # 19  6  #  #  #\n",
      " #  #  # 18  7  #  #  #\n",
      "13 14 15 16  8 10 11 12\n",
      " #  #  # M^  1  #  #  #\n",
      " #  #  # 23  2  #  #  #\n",
      " #  #  # 22  3  #  #  #\n",
      "22 次移动  其中24 次指令  总计 24 个步骤\t0:00:00.568043\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动\n",
      " #  #  #  #  4  #  #  #\n",
      " #  #  #  #  5  #  #  #\n",
      "23 22 21 19  6 M< 25 24\n",
      " #  #  # 18  7  #  #  #\n",
      "13 14 15 16  8 10 11 12\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "23 次移动  其中26 次指令  总计 26 个步骤\t0:00:00.941838\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动\n",
      " #  #  #  #  4  #  #  #\n",
      "24 23 22 20  5 M< 26 25\n",
      " #  #  # 19  6  #  #  #\n",
      " #  #  # 18  7  #  #  #\n",
      "13 14 15 16  8 10 11 12\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "24 次移动  其中27 次指令  总计 27 个步骤\t0:00:01.001375\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动\n",
      "25 24 23 21  4 M< 27 26\n",
      " #  #  # 20  5  #  #  #\n",
      " #  #  # 19  6  #  #  #\n",
      " #  #  # 18  7  #  #  #\n",
      "13 14 15 16  8 10 11 12\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "25 次移动  其中28 次指令  总计 28 个步骤\t0:00:01.059969\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " #  #  # 21  4  #  #  #\n",
      " #  #  # 20  5  #  #  #\n",
      " #  #  # 19  6  #  #  #\n",
      " #  #  # 18  7  #  #  #\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1  #  # M<\n",
      " #  #  # 23  2  #  #  #\n",
      " #  #  # 22  3  #  #  #\n",
      "26 次移动  其中29 次指令  总计 29 个步骤\t0:00:01.826092\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动\n",
      " #  #  # 21  4  #  #  #\n",
      " #  #  # 20  5  #  #  #\n",
      " #  #  # 19  6  #  #  #\n",
      " #  #  # 18  7  #  #  #\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1  # M< 29\n",
      " #  #  # 23  2  #  #  #\n",
      " #  #  # 22  3  #  #  #\n",
      "27 次移动  其中30 次指令  总计 30 个步骤\t0:00:01.829996\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动\n",
      " #  #  # 21  4  #  #  #\n",
      " #  #  # 20  5  #  #  #\n",
      " #  #  # 19  6  #  #  #\n",
      " #  #  # 18  7  #  #  #\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 M< 30 29\n",
      " #  #  # 23  2  #  #  #\n",
      " #  #  # 22  3  #  #  #\n",
      "28 次移动  其中31 次指令  总计 31 个步骤\t0:00:01.848575\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动\n",
      " #  #  # 21  4  #  #  #\n",
      " #  #  # 20  5  #  #  #\n",
      " #  #  # 19  6  #  #  #\n",
      " #  #  # 18  7  #  #  #\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 Mv  #  #\n",
      " #  #  # 22  3  #  #  #\n",
      "29 次移动  其中33 次指令  总计 33 个步骤\t0:00:01.870012\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动\n",
      " #  #  # 21  4  #  #  #\n",
      " #  #  # 20  5  #  #  #\n",
      " #  #  # 19  6  #  #  #\n",
      " #  #  # 18  7  #  #  #\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      " #  #  # 22  3 Mv  #  #\n",
      "30 次移动  其中34 次指令  总计 34 个步骤\t0:00:01.874927\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动\n",
      " #  #  # 21  4 Mv  #  #\n",
      " #  #  # 20  5  #  #  #\n",
      " #  #  # 19  6  #  #  #\n",
      " #  #  # 18  7  #  #  #\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      " #  #  # 22  3 34  #  #\n",
      "31 次移动  其中35 次指令  总计 35 个步骤\t0:00:01.896398\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动\n",
      " #  #  # 21  4 35  #  #\n",
      " #  #  # 20  5 Mv  #  #\n",
      " #  #  # 19  6  #  #  #\n",
      " #  #  # 18  7  #  #  #\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      " #  #  # 22  3 34  #  #\n",
      "32 次移动  其中36 次指令  总计 36 个步骤\t0:00:01.905161\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动\n",
      " #  #  # 21  4 35  #  #\n",
      " #  #  # 20  5 36  #  #\n",
      " #  #  # 19  6 Mv  #  #\n",
      " #  #  # 18  7  #  #  #\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      " #  #  # 22  3 34  #  #\n",
      "33 次移动  其中37 次指令  总计 37 个步骤\t0:00:02.105263\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动\n",
      " #  #  # 21  4 35  #  #\n",
      " #  #  # 20  5 36  #  #\n",
      " #  #  # 19  6 37  #  #\n",
      " #  #  # 18  7 Mv  #  #\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      " #  #  # 22  3 34  #  #\n",
      "34 次移动  其中38 次指令  总计 38 个步骤\t0:00:02.143325\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动\n",
      "39 M>  # 21  4 35 37 38\n",
      " #  #  # 20  5  #  #  #\n",
      " #  #  # 19  6  #  #  #\n",
      " #  #  # 18  7  #  #  #\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      " #  #  # 22  3 34  #  #\n",
      "35 次移动  其中40 次指令  总计 40 个步骤\t0:00:02.827503\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 移动 移动\n",
      "39 40 M> 21  4 35 37 38\n",
      " #  #  # 20  5  #  #  #\n",
      " #  #  # 19  6  #  #  #\n",
      " #  #  # 18  7  #  #  #\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      " #  #  # 22  3 34  #  #\n",
      "36 次移动  其中41 次指令  总计 41 个步骤\t0:00:02.907498\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动\n",
      " #  #  # 21  4 35  #  #\n",
      " #  #  # 20  5 36  #  #\n",
      " #  #  # 19  6 37  # M^\n",
      " #  #  # 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      " #  #  # 22  3 34  #  #\n",
      "37 次移动  其中43 次指令  总计 43 个步骤\t0:00:02.932880\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 |转弯| 移动\n",
      " #  #  # 21  4 35  #  #\n",
      " #  #  # 20  5 36  # M^\n",
      " #  #  # 19  6 37  # 43\n",
      " #  #  # 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      " #  #  # 22  3 34  #  #\n",
      "38 次移动  其中44 次指令  总计 44 个步骤\t0:00:02.973899\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 |转弯| 移动 移动\n",
      " #  #  # 21  4 35  #  #\n",
      " #  #  # 20  5 36 M< 44\n",
      " #  #  # 19  6 37  # 43\n",
      " #  #  # 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      " #  #  # 22  3 34  #  #\n",
      "39 次移动  其中46 次指令  总计 46 个步骤\t0:00:03.014891\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 |转弯| 移动 移动 |转弯| 移动\n",
      " #  #  # 21  4 35  # 45\n",
      " #  #  # 20  5 36  # 44\n",
      " #  #  # 19  6 37  # 43\n",
      " #  #  # 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      " #  #  # 22  3 34  # M^\n",
      "40 次移动  其中46 次指令  总计 46 个步骤\t0:00:03.024644\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 |转弯| 移动 移动 移动 移动\n",
      " #  #  # 21  4 35  # 45\n",
      " #  #  # 20  5 36  # 44\n",
      " #  #  # 19  6 37  # 43\n",
      " #  #  # 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  # M^\n",
      " #  #  # 22  3 34  # 46\n",
      "41 次移动  其中47 次指令  总计 47 个步骤\t0:00:03.065609\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 |转弯| 移动 移动 移动 移动 移动\n",
      " #  #  # 21  4 35  # 45\n",
      " #  #  # 20  5 36  # 44\n",
      " #  #  # 19  6 37  # 43\n",
      " #  #  # 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33 M< 47\n",
      " #  #  # 22  3 34  # 46\n",
      "42 次移动  其中49 次指令  总计 49 个步骤\t0:00:03.460923\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动\n",
      " #  #  # 21  4 35  # 45\n",
      " #  #  # 20  5 36  # 44\n",
      " #  #  # 19  6 37  # 43\n",
      " #  #  # 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33 49 47\n",
      " #  #  # 22  3 34 Mv 46\n",
      "43 次移动  其中51 次指令  总计 51 个步骤\t0:00:04.426185\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 |转弯| 移动\n",
      " #  #  # 21  4 35 Mv 45\n",
      " #  #  # 20  5 36  # 44\n",
      " #  #  # 19  6 37  # 43\n",
      " #  #  # 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33 49 47\n",
      " #  #  # 22  3 34 51 46\n",
      "44 次移动  其中52 次指令  总计 52 个步骤\t0:00:04.590161\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 |转弯| 移动 移动\n",
      " #  #  # 21  4 35 52 45\n",
      " #  #  # 20  5 36 Mv 44\n",
      " #  #  # 19  6 37  # 43\n",
      " #  #  # 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33 49 47\n",
      " #  #  # 22  3 34 51 46\n",
      "45 次移动  其中53 次指令  总计 53 个步骤\t0:00:04.595040\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 |转弯| 移动 移动 移动\n",
      " #  #  # 21  4 35 52 45\n",
      " #  #  # 20  5 36 53 44\n",
      " #  #  # 19  6 37 Mv 43\n",
      " #  #  # 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33 49 47\n",
      " #  #  # 22  3 34 51 46\n",
      "46 次移动  其中54 次指令  总计 54 个步骤\t0:00:04.624306\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 |转弯| 移动 移动 移动 移动\n",
      " #  # 48 21  4 35  #  #\n",
      " #  # 47 20  5 36  #  #\n",
      " #  # 46 19  6 37  #  #\n",
      "42 43 44 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      "52 51 49 22  3 34  # M<\n",
      "46 次移动  其中53 次指令  总计 53 个步骤\t0:00:05.317238\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动\n",
      " #  # 48 21  4 35  #  #\n",
      " #  # 47 20  5 36  #  #\n",
      " #  # 46 19  6 37  #  #\n",
      "42 43 44 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      "52 51 49 22  3 34 M< 53\n",
      "47 次移动  其中54 次指令  总计 54 个步骤\t0:00:05.385596\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " #  # 48 21  4 35  #  #\n",
      " #  # 47 20  5 36  #  #\n",
      " #  # 46 19  6 37  #  #\n",
      "42 43 44 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      "53 52 50 23  2 33 M< 54\n",
      " #  # 49 22  3 34  #  #\n",
      "48 次移动  其中55 次指令  总计 55 个步骤\t0:00:05.598328\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动\n",
      " #  # 48 21  4 35 56  #\n",
      " #  # 47 20  5 36 Mv  #\n",
      " #  # 46 19  6 37  #  #\n",
      "42 43 44 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      "52 51 49 22  3 34 54 53\n",
      "49 次移动  其中57 次指令  总计 57 个步骤\t0:00:06.076607\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动\n",
      " #  # 48 21  4 35 56  #\n",
      " #  # 47 20  5 36 57  #\n",
      " #  # 46 19  6 37 Mv  #\n",
      "42 43 44 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      "52 51 49 22  3 34 54 53\n",
      "50 次移动  其中58 次指令  总计 58 个步骤\t0:00:06.092180\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动\n",
      " #  # 48 21  4 35 56  #\n",
      " #  # 47 20  5 36 57  #\n",
      " #  # 46 19  6 37 58 M>\n",
      "42 43 44 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      "52 51 49 22  3 34 54 53\n",
      "51 次移动  其中60 次指令  总计 60 个步骤\t0:00:06.136104\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动\n",
      " #  # 48 21  4 35 56  #\n",
      " #  # 47 20  5 36 57  #\n",
      "M>  # 46 19  6 37 58 60\n",
      "42 43 44 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      "52 51 49 22  3 34 54 53\n",
      "52 次移动  其中61 次指令  总计 61 个步骤\t0:00:06.160500\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动\n",
      " #  # 48 21  4 35 56  #\n",
      " #  # 47 20  5 36 57  #\n",
      "61 M> 46 19  6 37 58 60\n",
      "42 43 44 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      "52 51 49 22  3 34 54 53\n",
      "53 次移动  其中62 次指令  总计 62 个步骤\t0:00:06.215158\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 移动\n",
      " #  # 48 21  4 35 56  #\n",
      " # M^ 47 20  5 36 57  #\n",
      "61 62 46 19  6 37 58 60\n",
      "42 43 44 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      "52 51 49 22  3 34 54 53\n",
      "54 次移动  其中64 次指令  总计 64 个步骤\t0:00:09.414515\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动\n",
      " # M^ 48 21  4 35 56  #\n",
      " # 64 47 20  5 36 57  #\n",
      "61 62 46 19  6 37 58 60\n",
      "42 43 44 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      "52 51 49 22  3 34 54 53\n",
      "55 次移动  其中65 次指令  总计 65 个步骤\t0:00:09.519888\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动\n",
      " #  # 48 21  4 35 58  #\n",
      " #  # 47 20  5 36 59  #\n",
      "63 M> 46 19  6 37 60 62\n",
      "42 43 44 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      "53 52 50 23  2 33 55 54\n",
      " #  # 49 22  3 34 57  #\n",
      "55 次移动  其中64 次指令  总计 64 个步骤\t0:00:10.424671\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动\n",
      "M< 65 48 21  4 35 56  #\n",
      " # 64 47 20  5 36 57  #\n",
      "61 62 46 19  6 37 58 60\n",
      "42 43 44 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      "52 51 49 22  3 34 54 53\n",
      "56 次移动  其中67 次指令  总计 67 个步骤\t0:00:10.539805\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 |转弯| 移动\n",
      "67 65 48 21  4 35 56 M<\n",
      " # 64 47 20  5 36 57  #\n",
      "61 62 46 19  6 37 58 60\n",
      "42 43 44 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      "52 51 49 22  3 34 54 53\n",
      "57 次移动  其中68 次指令  总计 68 个步骤\t0:00:10.566158\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 |转弯| 移动 移动\n",
      "67 65 48 21  4 35 56 68\n",
      " # 64 47 20  5 36 57 Mv\n",
      "61 62 46 19  6 37 58 60\n",
      "42 43 44 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      "52 51 49 22  3 34 54 53\n",
      "58 次移动  其中70 次指令  总计 70 个步骤\t0:00:11.049318\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 |转弯| 移动 移动 |转弯| 移动\n",
      "67 65 48 21  4 35 56 68\n",
      "M> 64 47 20  5 36 57 70\n",
      "61 62 46 19  6 37 58 60\n",
      "42 43 44 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      " #  #  # 23  2 33  #  #\n",
      "52 51 49 22  3 34 54 53\n",
      "59 次移动  其中72 次指令  总计 72 个步骤\t0:00:11.275712\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 |转弯| 移动 移动 |转弯| 移动 |转弯| 移动\n",
      " # 67 48 21  4 35 58  #\n",
      " # 66 47 20  5 36 59  #\n",
      "63 64 46 19  6 37 60 62\n",
      "42 43 44 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      "53 52 50 23  2 33 55 54\n",
      "M< 68 49 22  3 34 57  #\n",
      "59 次移动  其中70 次指令  总计 70 个步骤\t0:00:12.959340\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动\n",
      " # 67 48 21  4 35 58  #\n",
      " # 66 47 20  5 36 59  #\n",
      "63 64 46 19  6 37 60 62\n",
      "42 43 44 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      "53 52 50 23  2 33 55 54\n",
      "70 68 49 22  3 34 57 M<\n",
      "60 次移动  其中71 次指令  总计 71 个步骤\t0:00:13.129169\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动\n",
      " # 67 48 21  4 35 58 Mv\n",
      " # 66 47 20  5 36 59  #\n",
      "63 64 46 19  6 37 60 62\n",
      "42 43 44 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      "53 52 50 23  2 33 55 54\n",
      "70 68 49 22  3 34 57 71\n",
      "61 次移动  其中73 次指令  总计 73 个步骤\t0:00:13.412168\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 |转弯| 移动\n",
      " # 67 48 21  4 35 58 73\n",
      " # 66 47 20  5 36 59 Mv\n",
      "63 64 46 19  6 37 60 62\n",
      "42 43 44 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      "53 52 50 23  2 33 55 54\n",
      "70 68 49 22  3 34 57 71\n",
      "62 次移动  其中74 次指令  总计 74 个步骤\t0:00:13.625945\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 |转弯| 移动 移动\n",
      " # 67 48 21  4 35 58 73\n",
      "M> 66 47 20  5 36 59 74\n",
      "63 64 46 19  6 37 60 62\n",
      "42 43 44 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      "53 52 50 23  2 33 55 54\n",
      "70 68 49 22  3 34 57 71\n",
      "63 次移动  其中76 次指令  总计 76 个步骤\t0:00:16.093260\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 |转弯| 移动 移动 |转弯| 移动\n",
      "M^ 67 48 21  4 35 58 73\n",
      "76 66 47 20  5 36 59 74\n",
      "63 64 46 19  6 37 60 62\n",
      "42 43 44 18  7 38 40 41\n",
      "13 14 15 16  8 10 11 12\n",
      "28 27 26 24  1 31 30 29\n",
      "53 52 50 23  2 33 55 54\n",
      "70 68 49 22  3 34 57 71\n",
      "64 次移动  其中78 次指令  总计 78 个步骤\t0:00:17.066307\n",
      "移动 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 移动 |转弯| 移动 移动 |转弯| 移动 移动 |转弯| 移动 |转弯| 移动\n"
     ]
    }
   ],
   "source": [
    "test_mow_turn()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "def test_mow_turn_jump():\n",
    "        width = height = 8\n",
    "        geneSet = [lambda: Mow(),\n",
    "                   lambda: Turn(),\n",
    "                   lambda: Jump(random.randint(0, min(width, height)),\n",
    "                                random.randint(0, min(width, height)))]\n",
    "        minGenes = width * height\n",
    "        maxGenes = int(1.5 * minGenes)\n",
    "        maxMutationRounds = 1\n",
    "        expectedNumberOfInstructions = 64\n",
    "\n",
    "        def fnCreateField():\n",
    "            return ToroidField(width, height,\n",
    "                                         FieldContents.Grass)\n",
    "\n",
    "        run_with(geneSet, width, height, minGenes, maxGenes,\n",
    "                      expectedNumberOfInstructions, maxMutationRounds,\n",
    "                      fnCreateField, expectedNumberOfInstructions)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  # Mv  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      "0 次移动  其中0 次指令  总计 0 个步骤\t0:00:00\n",
      "\n",
      " #  3  #  #  #  #  #  #\n",
      "Mv  #  #  #  2  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      "4 次移动  其中4 次指令  总计 4 个步骤\t0:00:00.000976\n",
      "jump(8,8) jump(5,0) jump(7,3) jump(1,1)\n",
      " #  #  # M^  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " 1  #  6  #  #  #  #  #\n",
      " #  2  4  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      "5 次移动  其中7 次指令  总计 7 个步骤\t0:00:00.001952\n",
      "jump(0,4) jump(1,7) |转弯| 移动 |转弯| 移动 jump(4,1)\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  2  #  #  #  #\n",
      " #  #  #  #  #  3  #  #\n",
      " #  #  5  #  1  4 M>  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      "6 次移动  其中7 次指令  总计 7 个步骤\t0:00:00.002927\n",
      "jump(8,8) jump(6,1) jump(1,6) 移动 jump(0,3) jump(0,4) |转弯|\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  2\n",
      " #  #  #  #  #  #  3  #\n",
      " #  #  #  #  #  #  4  #\n",
      " #  #  #  #  #  #  5  #\n",
      " #  #  #  #  1  # Mv  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      "6 次移动  其中6 次指令  总计 6 个步骤\t0:00:00.008782\n",
      "移动 jump(4,5) jump(1,1) 移动 移动 移动\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  2\n",
      " #  #  #  #  #  #  3  #\n",
      " #  #  #  #  #  #  4  #\n",
      " #  #  #  #  #  #  5  #\n",
      " #  #  #  #  1  #  6  #\n",
      " #  #  #  #  #  # Mv  #\n",
      " #  #  #  #  #  #  #  #\n",
      "7 次移动  其中7 次指令  总计 7 个步骤\t0:00:00.021469\n",
      "移动 jump(4,5) jump(1,1) 移动 移动 移动 移动\n",
      " #  #  #  #  #  #  #  1\n",
      " #  #  #  #  #  #  #  2\n",
      " #  #  #  #  #  #  6  3\n",
      " #  #  7  #  #  #  #  4\n",
      " #  #  #  #  #  #  #  5\n",
      " #  #  #  #  #  #  #  #\n",
      " #  # Mv  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      "8 次移动  其中8 次指令  总计 8 个步骤\t0:00:00.036143\n",
      "jump(4,5) 移动 移动 移动 移动 jump(6,1) jump(1,4) jump(3,8)\n",
      " #  8  #  #  #  #  #  #\n",
      " # Mv  #  #  #  #  #  7\n",
      " #  #  #  #  #  #  #  4\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  6  #  1  #  #  #\n",
      " #  #  #  #  2  #  5  #\n",
      " #  #  #  #  3  #  #  #\n",
      "9 次移动  其中9 次指令  总计 9 个步骤\t0:00:00.093694\n",
      "移动 移动 移动 jump(3,5) jump(4,1) jump(7,4) jump(4,3) jump(7,6) 移动\n",
      " #  8  #  #  #  #  #  #\n",
      " #  9  #  #  #  #  #  7\n",
      " #  #  #  #  #  #  #  4\n",
      " # Mv  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  6  #  1  #  #  #\n",
      " #  #  #  #  2  #  5  #\n",
      " #  #  #  #  3  #  #  #\n",
      "10 次移动  其中10 次指令  总计 10 个步骤\t0:00:00.121998\n",
      "移动 移动 移动 jump(3,5) jump(4,1) jump(7,4) jump(4,3) jump(7,6) 移动 jump(2,0)\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  4\n",
      " #  #  #  #  #  #  #  5\n",
      " #  #  #  #  #  #  #  #\n",
      "10  6  #  8  1  #  #  #\n",
      "Mv  7  #  9  2  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      "11 次移动  其中11 次指令  总计 11 个步骤\t0:00:00.157134\n",
      "移动 移动 移动 jump(3,5) 移动 jump(2,6) 移动 jump(7,6) 移动 jump(7,3) 移动\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  4\n",
      " #  #  #  #  #  #  #  5\n",
      " #  #  #  #  #  #  #  #\n",
      "10  6  #  8  1  #  #  #\n",
      "11  7  #  9  2  #  #  #\n",
      " #  #  #  #  3  # Mv  #\n",
      "12 次移动  其中12 次指令  总计 12 个步骤\t0:00:00.160063\n",
      "移动 移动 移动 jump(3,5) 移动 jump(2,6) 移动 jump(7,6) 移动 jump(7,3) 移动 jump(1,2)\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  8  #  #  #  # 10\n",
      " 7  #  9  #  3  #  # 11\n",
      " #  #  #  #  4 12  #  #\n",
      " 6  #  #  #  5 Mv  #  #\n",
      " #  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      "13 次移动  其中13 次指令  总计 13 个步骤\t0:00:00.189340\n",
      "移动 移动 jump(4,8) 移动 移动 jump(8,4) jump(6,0) jump(7,6) 移动 jump(7,3) 移动 jump(1,2) 移动\n",
      " #  #  #  #  #  # 12  #\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  3  #  #  #\n",
      " #  #  #  #  #  8  #  #\n",
      " #  #  #  7  #  9  #  #\n",
      " #  #  #  #  1 13  #  4\n",
      " #  #  #  6  2 Mv 10  5\n",
      " #  #  #  #  #  # 11  #\n",
      "14 次移动  其中14 次指令  总计 14 个步骤\t0:00:00.207885\n",
      "移动 移动 jump(4,8) jump(3,5) 移动 jump(8,4) jump(6,0) jump(7,6) 移动 jump(2,7) 移动 移动 jump(5,1) 移动\n",
      " #  #  #  #  #  6  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      "10  #  #  #  #  #  #  #\n",
      "11  #  #  #  #  #  #  #\n",
      " #  #  #  4  #  # 12  #\n",
      " #  #  #  5  1  # 13  8\n",
      " #  #  #  #  2  7 14  9\n",
      " #  #  #  #  3  # Mv  #\n",
      "15 次移动  其中15 次指令  总计 15 个步骤\t0:00:00.255710\n",
      "移动 移动 移动 jump(5,1) 移动 jump(3,6) jump(6,0) jump(7,6) 移动 jump(4,7) 移动 jump(1,2) 移动 移动 移动\n",
      " #  #  #  #  #  #  #  #\n",
      " #  #  #  #  #  #  #  #\n",
      "Mv  #  # 10  #  #  #  #\n",
      " #  #  4 11  #  #  #  #\n",
      " # 12  5  1  #  #  8  #\n",
      " # 13  #  2  7  #  9  #\n",
      " # 14  #  3  #  #  #  #\n",
      " # 15  #  #  6  #  #  #\n",
      "16 次移动  其中16 次指令  总计 16 个步骤\t0:00:00.285023\n",
      "jump(8,1) 移动 移动 jump(5,1) 移动 jump(3,6) jump(6,0) jump(7,6) 移动 jump(5,3) 移动 jump(1,2) 移动 移动 移动 jump(3,1)\n",
      " # 15  #  8  #  #  #  5\n",
      " #  7  #  9 10  #  #  #\n",
      " #  #  #  # 11  #  #  #\n",
      " #  6 12 16  #  #  #  #\n",
      " #  # 13  #  #  #  #  #\n",
      " #  # 14 Mv  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  #  3  #  #  4\n",
      "17 次移动  其中17 次指令  总计 17 个步骤\t0:00:00.360142\n",
      "移动 移动 移动 jump(0,5) 移动 jump(3,6) jump(6,0) jump(7,6) 移动 jump(8,7) 移动 jump(1,2) 移动 移动 jump(3,1) jump(3,6) jump(2,8)\n",
      " # 15  #  8  #  #  #  5\n",
      " #  7  #  9 10  #  #  #\n",
      " #  #  #  # 11  #  #  #\n",
      " #  6 12 16  #  #  #  #\n",
      " #  # 13  #  #  #  #  #\n",
      " #  # 14 17  1  #  #  #\n",
      " #  #  # Mv  2  #  #  #\n",
      " #  #  #  #  3  #  #  4\n",
      "18 次移动  其中18 次指令  总计 18 个步骤\t0:00:00.386495\n",
      "移动 移动 移动 jump(0,5) 移动 jump(3,6) jump(6,0) jump(7,6) 移动 jump(8,7) 移动 jump(1,2) 移动 移动 jump(3,1) jump(3,6) jump(2,8) 移动\n",
      " 8  #  #  5  #  # 13 17\n",
      " 9  #  #  6  7  #  # 18\n",
      "10  #  #  #  #  #  # Mv\n",
      "11  #  #  #  3  #  #  #\n",
      "14  #  #  #  #  #  #  #\n",
      "15  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  4  #  # 12 16\n",
      "19 次移动  其中19 次指令  总计 19 个步骤\t0:00:00.429440\n",
      "移动 移动 jump(5,0) jump(4,1) 移动 移动 jump(8,7) jump(7,4) 移动 移动 移动 jump(4,2) 移动 jump(4,6) 移动 jump(2,1) 移动 移动 移动\n",
      " 8  #  #  5  #  # 13 17\n",
      " 9  #  #  6  7  #  # 18\n",
      "10  #  #  #  #  #  # 19\n",
      "11  #  #  #  3  #  # Mv\n",
      "14  #  #  #  #  #  #  #\n",
      "15  #  #  #  1  #  #  #\n",
      " #  #  #  #  2  #  #  #\n",
      " #  #  #  4  #  # 12 16\n",
      "20 次移动  其中20 次指令  总计 20 个步骤\t0:00:00.442125\n",
      "移动 移动 jump(5,0) jump(4,1) 移动 移动 jump(8,7) jump(7,4) 移动 移动 移动 jump(4,2) 移动 jump(4,6) 移动 jump(2,1) 移动 移动 移动 移动\n",
      " # 18  #  5  #  #  #  #\n",
      " # 19  #  6  #  #  #  8\n",
      " # 20  #  7  #  #  #  #\n",
      " #  # 14  #  3  #  #  9\n",
      " #  # 15  #  #  #  # 10\n",
      " #  #  #  #  1  #  # 11\n",
      " # 16  #  #  2  #  # 12\n",
      " # 17  #  4 Mv  #  # 13\n",
      "21 次移动  其中21 次指令  总计 21 个步骤\t0:00:00.534845\n",
      "移动 移动 jump(5,0) jump(4,1) 移动 移动 移动 jump(7,4) jump(2,8) 移动 移动 移动 移动 jump(4,5) 移动 jump(2,1) 移动 移动 移动 移动 jump(5,5)\n",
      " # 18  #  5  #  #  #  #\n",
      " # 19  #  6  #  #  #  8\n",
      " # 20  #  7  #  #  #  #\n",
      " #  # 14  #  3  #  #  9\n",
      " #  # 15  #  #  #  # 10\n",
      " #  #  # Mv  1  #  # 11\n",
      " # 16  #  #  2  #  # 12\n",
      " # 17  #  4 21  #  # 13\n",
      "22 次移动  其中22 次指令  总计 22 个步骤\t0:00:00.542653\n",
      "移动 移动 jump(5,0) jump(4,1) 移动 移动 移动 jump(7,4) jump(2,8) 移动 移动 移动 移动 jump(4,5) 移动 jump(2,1) 移动 移动 移动 移动 jump(5,5) jump(6,1)\n",
      " #  # 15  #  #  #  # 10\n",
      " #  #  # 22  #  #  # 11\n",
      " # 16  #  #  #  #  # 12\n",
      " # 17  #  4 21  #  # 13\n",
      " # 18  #  5  #  #  #  #\n",
      " # 19  #  6  1  #  #  8\n",
      " # 20  #  7  2  #  #  #\n",
      "Mv  # 14  #  3  #  #  9\n",
      "23 次移动  其中23 次指令  总计 23 个步骤\t0:00:00.646144\n",
      "移动 移动 移动 jump(4,1) 移动 移动 移动 jump(7,4) jump(2,8) 移动 移动 移动 移动 jump(4,5) 移动 jump(2,1) 移动 移动 移动 移动 jump(5,5) jump(6,1) jump(6,3)\n",
      "Mv  # 15  #  3  #  # 10\n",
      " #  #  # 22  #  #  # 11\n",
      " # 16  #  #  #  #  # 12\n",
      " # 17  #  # 21  #  # 13\n",
      " # 18  #  4  #  #  #  #\n",
      " # 19  #  5  1  #  #  #\n",
      " # 20  #  6  2  #  #  8\n",
      "23  # 14  7  #  #  #  9\n",
      "24 次移动  其中24 次指令  总计 24 个步骤\t0:00:00.677341\n",
      "移动 移动 jump(2,0) jump(4,1) 移动 移动 移动 jump(7,4) 移动 移动 移动 移动 移动 jump(4,5) 移动 jump(2,1) 移动 移动 移动 移动 jump(5,5) jump(6,1) jump(6,3) jump(1,0)\n",
      "24  # 15  #  3  #  # 10\n",
      "Mv  #  # 22  #  #  # 11\n",
      " # 16  #  #  #  #  # 12\n",
      " # 17  #  # 21  #  # 13\n",
      " # 18  #  4  #  #  #  #\n",
      " # 19  #  5  1  #  #  #\n",
      " # 20  #  6  2  #  #  8\n",
      "23  # 14  7  #  #  #  9\n",
      "25 次移动  其中25 次指令  总计 25 个步骤\t0:00:00.702749\n",
      "移动 移动 jump(2,0) jump(4,1) 移动 移动 移动 jump(7,4) 移动 移动 移动 移动 移动 jump(4,5) 移动 jump(2,1) 移动 移动 移动 移动 jump(5,5) jump(6,1) jump(6,3) 移动 移动\n",
      " # 24 15  #  3  #  # 10\n",
      " # 25  #  # 22  #  # 11\n",
      " # 16 Mv  #  #  #  # 12\n",
      " # 17  #  # 21  #  # 13\n",
      " # 18  #  4  #  #  #  #\n",
      " # 19  #  5  1  #  #  #\n",
      " # 20  #  6  2  #  #  8\n",
      " # 23 14  7  #  #  #  9\n",
      "26 次移动  其中26 次指令  总计 26 个步骤\t0:00:00.788605\n",
      "移动 移动 jump(2,0) jump(4,1) 移动 移动 移动 jump(7,4) 移动 移动 移动 移动 移动 jump(4,5) 移动 jump(2,1) 移动 移动 移动 移动 jump(5,5) jump(6,8) jump(6,3) 移动 移动 jump(1,7)\n",
      " #  #  # 18  #  #  # 11\n",
      " #  #  # 19  #  #  # 12\n",
      " #  #  #  # 26 23  # 13\n",
      " #  #  #  4 Mv 24  # 14\n",
      "22  #  #  5  # 25 17  #\n",
      "20  # 15  6  1  #  #  8\n",
      "21  # 16  7  2  #  #  9\n",
      " #  #  #  #  3  #  # 10\n",
      "27 次移动  其中27 次指令  总计 27 个步骤\t0:00:00.999419\n",
      "移动 移动 移动 jump(4,1) 移动 移动 移动 jump(7,4) 移动 移动 移动 移动 移动 移动 jump(2,5) 移动 jump(6,4) jump(4,3) 移动 jump(4,3) 移动 jump(6,8) jump(6,3) 移动 移动 jump(6,1) 移动\n",
      " #  #  # 18  #  #  # 11\n",
      " #  #  # 19  #  #  # 12\n",
      " #  #  #  # 26 23  # 13\n",
      " #  #  #  4 27 24  # 14\n",
      "22  #  #  5 Mv 25 17  #\n",
      "20  # 15  6  1  #  #  8\n",
      "21  # 16  7  2  #  #  9\n",
      " #  #  #  #  3  #  # 10\n",
      "28 次移动  其中28 次指令  总计 28 个步骤\t0:00:01.019916\n",
      "移动 移动 移动 jump(4,1) 移动 移动 移动 jump(7,4) 移动 移动 移动 移动 移动 移动 jump(2,5) 移动 jump(6,4) jump(4,3) 移动 jump(4,3) 移动 jump(6,8) jump(6,3) 移动 移动 jump(6,1) 移动 移动\n",
      " 9 19  #  #  4  #  #  #\n",
      "10 20  # 24  5  #  #  #\n",
      "11 21  # 25  6  7 27 15\n",
      "12 22  # 26  #  # 28  #\n",
      "13 23  #  #  #  #  # Mv\n",
      "14 16  #  #  1  #  #  #\n",
      " # 17  #  #  2  #  #  #\n",
      " 8 18  #  #  3  #  #  #\n",
      "29 次移动  其中29 次指令  总计 29 个步骤\t0:00:01.068717\n",
      "移动 jump(1,0) 移动 移动 移动 移动 jump(8,7) jump(5,5) 移动 移动 移动 移动 移动 移动 jump(5,1) jump(3,6) 移动 移动 移动 移动 移动 移动 移动 jump(5,6) 移动 移动 jump(7,5) 移动 jump(1,7)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " 9 19  #  #  4  #  #  #\n",
      "10 20  # 24  5  #  #  #\n",
      "11 21  # 25  6  7 27 15\n",
      "12 22  # 26  #  # 28  #\n",
      "13 23  #  #  #  #  # 29\n",
      "14 16  #  #  1  #  # Mv\n",
      " # 17  #  #  2  #  #  #\n",
      " 8 18  #  #  3  #  #  #\n",
      "30 次移动  其中30 次指令  总计 30 个步骤\t0:00:01.189772\n",
      "移动 移动 移动 移动 移动 移动 jump(8,7) jump(5,5) 移动 移动 移动 移动 移动 移动 jump(5,1) jump(3,6) 移动 移动 移动 移动 移动 移动 移动 jump(5,6) 移动 移动 jump(7,5) 移动 jump(1,7) 移动\n",
      " 9 19  #  #  4  #  #  #\n",
      "10 20  # 24  5  #  #  #\n",
      "11 21  # 25  6  7 27 15\n",
      "12 22  # 26  #  # 28  #\n",
      "13 23  #  #  #  # 29  #\n",
      "14 16  #  #  1  # 30 Mv\n",
      " # 17  #  #  2  #  #  #\n",
      " 8 18  #  #  3  #  #  #\n",
      "31 次移动  其中31 次指令  总计 31 个步骤\t0:00:01.253212\n",
      "移动 移动 移动 移动 移动 移动 jump(8,7) jump(5,5) 移动 移动 移动 移动 移动 移动 jump(5,1) jump(3,6) 移动 移动 移动 移动 移动 移动 移动 jump(5,6) 移动 移动 jump(7,5) 移动 移动 移动 jump(8,7)\n",
      "18  #  #  #  4  #  #  8\n",
      "19  #  #  #  5  #  #  9\n",
      "20  # 24  #  6  #  # 10\n",
      "21  # 25  #  7 27 15 11\n",
      "22  # 26  #  # 28  # 12\n",
      "23  #  #  #  1 29  # 13\n",
      "16  #  #  #  2 30 31 14\n",
      "17  #  #  #  3  # Mv  #\n",
      "32 次移动  其中32 次指令  总计 32 个步骤\t0:00:01.343948\n",
      "移动 移动 移动 移动 移动 移动 移动 jump(5,5) 移动 移动 移动 移动 移动 移动 jump(5,1) jump(3,6) 移动 移动 移动 移动 移动 移动 移动 jump(5,6) 移动 移动 jump(7,5) 移动 移动 移动 jump(8,7) 移动\n",
      "18  #  #  #  4  # Mv  8\n",
      "19  #  #  #  5  #  #  9\n",
      "20  # 24  #  6  #  # 10\n",
      "21  # 25  #  7 27 15 11\n",
      "22  # 26  #  # 28  # 12\n",
      "23  #  #  #  1 29  # 13\n",
      "16  #  #  #  2 30 31 14\n",
      "17  #  #  #  3  # 32  #\n",
      "33 次移动  其中33 次指令  总计 33 个步骤\t0:00:01.367375\n",
      "移动 移动 移动 移动 移动 移动 移动 jump(5,5) 移动 移动 移动 移动 移动 移动 jump(5,1) jump(3,6) 移动 移动 移动 移动 移动 移动 移动 jump(5,6) 移动 移动 jump(7,5) 移动 移动 移动 jump(8,7) 移动 移动\n",
      "18  #  #  #  4  # 33  8\n",
      "19  #  #  #  5  # Mv  9\n",
      "20  # 24  #  6  #  # 10\n",
      "21  # 25  #  7 27 15 11\n",
      "22  # 26  #  # 28  # 12\n",
      "23  #  #  #  1 29  # 13\n",
      "16  #  #  #  2 30 31 14\n",
      "17  #  #  #  3  # 32  #\n",
      "34 次移动  其中34 次指令  总计 34 个步骤\t0:00:01.417180\n",
      "移动 移动 移动 移动 移动 移动 移动 jump(5,5) 移动 移动 移动 移动 移动 移动 jump(5,1) jump(3,6) 移动 移动 移动 移动 移动 移动 移动 jump(5,6) 移动 移动 jump(7,5) 移动 移动 移动 jump(8,7) 移动 移动 移动\n",
      "18  #  #  #  4  # 33  8\n",
      "19  #  #  #  5  # 34  9\n",
      "20  # 24  #  6  # Mv 10\n",
      "21  # 25  #  7 27 15 11\n",
      "22  # 26  #  # 28  # 12\n",
      "23  #  #  #  1 29  # 13\n",
      "16  #  #  #  2 30 31 14\n",
      "17  #  #  #  3  # 32  #\n",
      "35 次移动  其中35 次指令  总计 35 个步骤\t0:00:01.471805\n",
      "移动 移动 移动 移动 移动 移动 移动 jump(5,5) 移动 移动 移动 移动 移动 移动 jump(5,1) jump(3,6) 移动 移动 移动 移动 移动 移动 移动 jump(5,6) 移动 移动 jump(7,5) 移动 移动 移动 jump(8,7) 移动 移动 移动 移动\n",
      " # 34 20  # 24  # 13  #\n",
      "15 35 21  # 25  #  # 27\n",
      " #  # 22  # 26  1  # 28\n",
      " #  # 23  #  #  2  8 29\n",
      "31 14 16  #  #  3  9 30\n",
      " # Mv 17  6  #  4 10  #\n",
      " # 32 18  7  #  5 11  #\n",
      " # 33 19  #  #  # 12  #\n",
      "36 次移动  其中36 次指令  总计 36 个步骤\t0:00:01.786075\n",
      "jump(6,7) 移动 移动 移动 移动 jump(7,2) 移动 jump(5,5) 移动 移动 移动 移动 移动 jump(4,5) jump(5,1) jump(3,6) 移动 移动 移动 移动 移动 移动 移动 jump(5,6) 移动 移动 jump(7,5) 移动 移动 移动 jump(8,7) jump(2,7) 移动 移动 移动 jump(4,8)\n",
      "13  #  # 32 20  # 24  #\n",
      " # 27 15 33 21  # 25  1\n",
      " 8 28  # 34 22  # 26  2\n",
      " 9  #  # 35 23  #  #  3\n",
      " #  #  # 14 16  6 Mv  4\n",
      "10 29  #  # 17  7  #  5\n",
      "11 30 31  # 18  #  #  #\n",
      "12  #  # 36 19  #  #  #\n",
      "37 次移动  其中37 次指令  总计 37 个步骤\t0:00:02.169674\n",
      "jump(5,5) 移动 移动 移动 移动 jump(7,2) 移动 jump(5,5) 移动 jump(2,8) 移动 移动 移动 jump(4,5) jump(5,1) jump(3,6) 移动 移动 移动 移动 移动 移动 移动 jump(5,6) 移动 移动 jump(7,5) 移动 jump(3,8) 移动 jump(8,7) jump(2,7) 移动 移动 移动 jump(4,8) jump(5,5)\n",
      " # 27 15 33 21  # 25  #\n",
      " # 28  # 34 22  # 26  1\n",
      " 8  #  # 35 23  #  #  2\n",
      " 9  #  # 14 16  # 37  3\n",
      "10 29  #  # 17  6  #  4\n",
      "11 30 31  # 18  7  #  5\n",
      "12  # Mv 36 19  #  #  #\n",
      "13  #  # 32 20  # 24  #\n",
      "38 次移动  其中38 次指令  总计 38 个步骤\t0:00:02.202832\n",
      "jump(5,5) 移动 移动 移动 移动 jump(7,2) 移动 jump(5,5) 移动 移动 移动 移动 移动 jump(4,5) jump(5,1) jump(3,6) 移动 移动 移动 移动 移动 移动 移动 jump(5,6) 移动 移动 jump(7,5) 移动 jump(3,8) 移动 jump(8,7) jump(2,7) 移动 移动 移动 jump(4,8) jump(5,5) jump(3,4)\n",
      " # 27 15 33 21  # 25  #\n",
      " # 28  # 34 22  # 26  1\n",
      " 8  #  # 35 23  #  #  2\n",
      " 9  #  # 14 16  # 37  3\n",
      "10 29  #  # 17  6  #  4\n",
      "11 30 31  # 18  7  #  5\n",
      "12  # 38 36 19  #  #  #\n",
      "13  # Mv 32 20  # 24  #\n",
      "39 次移动  其中39 次指令  总计 39 个步骤\t0:00:02.216503\n",
      "jump(5,5) 移动 移动 移动 移动 jump(7,2) 移动 jump(5,5) 移动 移动 移动 移动 移动 jump(4,5) jump(5,1) jump(3,6) 移动 移动 移动 移动 移动 移动 移动 jump(5,6) 移动 移动 jump(7,5) 移动 jump(3,8) 移动 jump(8,7) jump(2,7) 移动 移动 移动 jump(4,8) jump(5,5) jump(3,4) 移动\n",
      "28  # 17 36 25  #  9  #\n",
      "29  # 18 37  #  # 10  #\n",
      "30  2 19 38 26  # 11 32\n",
      "31  3 20 39  #  # 12 33\n",
      " #  4 21 Mv  #  # 13  #\n",
      " #  5 22  #  1  # 14  #\n",
      " #  6 23  #  #  #  7  #\n",
      "34 27 16 35 24  #  8 15\n",
      "40 次移动  其中40 次指令  总计 40 个步骤\t0:00:02.484888\n",
      "移动 jump(5,3) 移动 移动 移动 移动 jump(8,3) 移动 移动 移动 移动 移动 移动 jump(1,8) jump(2,7) jump(0,5) 移动 移动 移动 移动 移动 移动 移动 jump(1,6) 移动 jump(2,8) jump(5,3) jump(1,1) 移动 移动 移动 jump(7,1) 移动 jump(4,7) jump(0,5) 移动 移动 移动 移动 移动\n",
      "28  # 17 36 25  #  9  #\n",
      "29  # 18 37  #  # 10  #\n",
      "30  2 19 38 26  # 11 32\n",
      "31  3 20 39  #  # 12 33\n",
      " #  4 21 40  #  # 13  #\n",
      " #  5 22 Mv  1  # 14  #\n",
      " #  6 23  #  #  #  7  #\n",
      "34 27 16 35 24  #  8 15\n",
      "41 次移动  其中41 次指令  总计 41 个步骤\t0:00:02.519082\n",
      "移动 jump(5,3) 移动 移动 移动 移动 jump(8,3) 移动 移动 移动 移动 移动 移动 jump(1,8) jump(2,7) jump(0,5) 移动 移动 移动 移动 移动 移动 移动 jump(1,6) 移动 jump(2,8) jump(5,3) jump(1,1) 移动 移动 移动 jump(7,1) 移动 jump(4,7) jump(0,5) 移动 移动 移动 移动 移动 移动\n",
      "28  # 17 36 25  #  9  #\n",
      "29  # 18 37  #  # 10  #\n",
      "30  2 19 38 26  # 11 32\n",
      "31  3 20 39  #  # 12 33\n",
      " #  4 21 40  #  # 13  #\n",
      " #  5 22 41  1  # 14  #\n",
      " #  6 23 Mv  #  #  7  #\n",
      "34 27 16 35 24  #  8 15\n",
      "42 次移动  其中42 次指令  总计 42 个步骤\t0:00:02.527833\n",
      "移动 jump(5,3) 移动 移动 移动 移动 jump(8,3) 移动 移动 移动 移动 移动 移动 jump(1,8) jump(2,7) jump(0,5) 移动 移动 移动 移动 移动 移动 移动 jump(1,6) 移动 jump(2,8) jump(5,3) jump(1,1) 移动 移动 移动 jump(7,1) 移动 jump(4,7) jump(0,5) 移动 移动 移动 移动 移动 移动 移动\n",
      " # 17  6  #  4 10 29  #\n",
      " # 18  7  #  5 11 30 31\n",
      "36 19 41  #  # 12  # 38\n",
      "32 20 42 24  # 13  #  #\n",
      "33 21 Mv 25 40 39 27 15\n",
      "34 22  # 26  1  # 28  #\n",
      "35 23  #  #  2  8  #  #\n",
      "14 16  # 37  3  9  #  #\n",
      "43 次移动  其中43 次指令  总计 43 个步骤\t0:00:02.762072\n",
      "移动 移动 移动 移动 移动 jump(7,2) 移动 jump(5,5) 移动 移动 移动 移动 移动 jump(4,5) jump(5,1) jump(3,6) 移动 移动 移动 移动 移动 移动 移动 jump(5,6) 移动 移动 jump(7,5) 移动 jump(3,8) 移动 jump(8,7) jump(2,7) 移动 移动 移动 jump(4,8) jump(5,5) jump(3,4) jump(2,2) jump(8,1) jump(6,2) 移动 移动\n",
      " # 17  6  #  4 10 29  #\n",
      " # 18  7  #  5 11 30 31\n",
      "36 19 41  #  # 12  # 38\n",
      "32 20 42 24  # 13  #  #\n",
      "33 21 43 25 40 39 27 15\n",
      "34 22 Mv 26  1  # 28  #\n",
      "35 23  #  #  2  8  #  #\n",
      "14 16  # 37  3  9  #  #\n",
      "44 次移动  其中44 次指令  总计 44 个步骤\t0:00:02.776712\n",
      "移动 移动 移动 移动 移动 jump(7,2) 移动 jump(5,5) 移动 移动 移动 移动 移动 jump(4,5) jump(5,1) jump(3,6) 移动 移动 移动 移动 移动 移动 移动 jump(5,6) 移动 移动 jump(7,5) 移动 jump(3,8) 移动 jump(8,7) jump(2,7) 移动 移动 移动 jump(4,8) jump(5,5) jump(3,4) jump(2,2) jump(8,1) jump(6,2) 移动 移动 移动\n",
      " # 17  6  #  4 10 29  #\n",
      " # 18  7  #  5 11 30 31\n",
      "36 19 41  #  # 12  # 38\n",
      "32 20 42 24  # 13  #  #\n",
      "33 21 43 25 40 39 27 15\n",
      "34 22 44 26  1  # 28  #\n",
      "35 23 Mv  #  2  8  #  #\n",
      "14 16  # 37  3  9  #  #\n",
      "45 次移动  其中45 次指令  总计 45 个步骤\t0:00:02.858697\n",
      "移动 移动 移动 移动 移动 jump(7,2) 移动 jump(5,5) 移动 移动 移动 移动 移动 jump(4,5) jump(5,1) jump(3,6) 移动 移动 移动 移动 移动 移动 移动 jump(5,6) 移动 移动 jump(7,5) 移动 jump(3,8) 移动 jump(8,7) jump(2,7) 移动 移动 移动 jump(4,8) jump(5,5) jump(3,4) jump(2,2) jump(8,1) jump(6,2) 移动 移动 移动 移动\n",
      " # 17  6  #  4 10 29  #\n",
      " # 18  7  #  5 11 30 31\n",
      "36 19 41  #  # 12  # 38\n",
      "32 20 42 24  # 13  #  #\n",
      "33 21 43 25 40 39 27 15\n",
      "34 22 44 26  1  # 28  #\n",
      "35 23 45  #  2  8  #  #\n",
      "14 16 Mv 37  3  9  #  #\n",
      "46 次移动  其中46 次指令  总计 46 个步骤\t0:00:02.904568\n",
      "移动 移动 移动 移动 移动 jump(7,2) 移动 jump(5,5) 移动 移动 移动 移动 移动 jump(4,5) jump(5,1) jump(3,6) 移动 移动 移动 移动 移动 移动 移动 jump(5,6) 移动 移动 jump(7,5) 移动 jump(3,8) 移动 jump(8,7) jump(2,7) 移动 移动 移动 jump(4,8) jump(5,5) jump(3,4) jump(2,2) jump(8,1) jump(6,2) 移动 移动 移动 移动 移动\n",
      " # 17  6  #  4 10 29  #\n",
      " # 18  7  #  5 11 30 31\n",
      "36 19 41  #  # 12  # 38\n",
      "32 20 42 24  # 13 Mv  #\n",
      "33 21 43 25 40 39 27 15\n",
      "34 22 44 26  1  # 28  #\n",
      "35 23 45  #  2  8  #  #\n",
      "14 16 46 37  3  9  #  #\n",
      "47 次移动  其中47 次指令  总计 47 个步骤\t0:00:03.555560\n",
      "移动 移动 移动 移动 移动 jump(7,2) 移动 jump(5,5) 移动 移动 移动 移动 移动 jump(4,5) jump(5,1) jump(3,6) 移动 移动 移动 移动 移动 移动 移动 jump(5,6) 移动 移动 jump(7,5) 移动 jump(3,8) 移动 jump(8,7) jump(2,7) 移动 移动 移动 jump(4,8) jump(5,5) jump(3,4) jump(2,2) jump(8,1) jump(6,2) 移动 移动 移动 移动 移动 jump(4,4)\n",
      " #  8 20 30 15  6 43 26\n",
      " #  9 21  # 16  7  2 27\n",
      " # 10 46  #  #  #  3 28\n",
      " # 11 47 36 39 18 44  #\n",
      " # 12 Mv 37 40 19 45 41\n",
      " # 13  # 38 31  #  1 23\n",
      "34 14  #  # 32  4 35 24\n",
      "17  # 22 29 33  5 42 25\n",
      "48 次移动  其中48 次指令  总计 48 个步骤\t0:00:03.697114\n",
      "jump(1,6) jump(4,0) 移动 jump(4,1) 移动 移动 移动 jump(7,4) 移动 移动 移动 移动 移动 移动 jump(2,5) 移动 jump(6,4) jump(4,3) 移动 jump(4,3) 移动 jump(6,8) jump(6,3) 移动 移动 移动 移动 移动 jump(5,4) 移动 jump(5,7) 移动 移动 jump(7,4) jump(8,2) jump(5,3) 移动 移动 jump(6,7) 移动 jump(8,5) jump(3,1) 移动 jump(3,8) 移动 jump(6,4) 移动 移动\n",
      " #  8 20 30 15  6 43 26\n",
      " #  9 21  # 16  7  2 27\n",
      " # 10 46  #  #  #  3 28\n",
      " # 11 47 36 39 18 44  #\n",
      " # 12 48 37 40 19 45 41\n",
      " # 13 Mv 38 31  #  1 23\n",
      "34 14  #  # 32  4 35 24\n",
      "17  # 22 29 33  5 42 25\n",
      "49 次移动  其中49 次指令  总计 49 个步骤\t0:00:03.731289\n",
      "jump(1,6) jump(4,0) 移动 jump(4,1) 移动 移动 移动 jump(7,4) 移动 移动 移动 移动 移动 移动 jump(2,5) 移动 jump(6,4) jump(4,3) 移动 jump(4,3) 移动 jump(6,8) jump(6,3) 移动 移动 移动 移动 移动 jump(5,4) 移动 jump(5,7) 移动 移动 jump(7,4) jump(8,2) jump(5,3) 移动 移动 jump(6,7) 移动 jump(8,5) jump(3,1) 移动 jump(3,8) 移动 jump(6,4) 移动 移动 移动\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      " #  8 20 30 15  6 43 26\n",
      " #  9 21  # 16  7  2 27\n",
      " # 10 46  #  #  #  3 28\n",
      " # 11 47 36 39 18 44  #\n",
      " # 12 48 37 40 19 45 41\n",
      " # 13 49 38 31  #  1 23\n",
      "34 14 Mv  # 32  4 35 24\n",
      "17  # 22 29 33  5 42 25\n",
      "50 次移动  其中50 次指令  总计 50 个步骤\t0:00:03.871815\n",
      "jump(1,6) jump(4,0) 移动 jump(4,1) 移动 移动 移动 jump(7,4) 移动 移动 移动 移动 移动 移动 jump(2,5) 移动 jump(6,4) jump(4,3) 移动 jump(4,3) 移动 jump(6,8) jump(6,3) 移动 移动 移动 移动 移动 jump(5,4) 移动 jump(5,7) 移动 移动 jump(7,4) jump(8,2) jump(5,3) 移动 移动 jump(6,7) 移动 jump(8,5) jump(3,1) 移动 jump(3,8) 移动 jump(6,4) 移动 移动 移动 移动\n",
      " #  8 20 30 15  6 43 26\n",
      " #  9 21  # 16  7  2 27\n",
      " # 10 46  #  #  #  3 28\n",
      " # 11 47 36 39 18 44  #\n",
      " # 12 48 37 40 19 45 41\n",
      " # 13 49 38 31  #  1 23\n",
      "34 14 50 Mv 32  4 35 24\n",
      "17  # 22 29 33  5 42 25\n",
      "51 次移动  其中51 次指令  总计 51 个步骤\t0:00:03.882553\n",
      "jump(1,6) jump(4,0) 移动 jump(4,1) 移动 移动 移动 jump(7,4) 移动 移动 移动 移动 移动 移动 jump(2,5) 移动 jump(6,4) jump(4,3) 移动 jump(4,3) 移动 jump(6,8) jump(6,3) 移动 移动 移动 移动 移动 jump(5,4) 移动 jump(5,7) 移动 移动 jump(7,4) jump(8,2) jump(5,3) 移动 移动 jump(6,7) 移动 jump(8,5) jump(3,1) 移动 jump(3,8) 移动 jump(6,4) 移动 移动 移动 移动 jump(0,7)\n",
      "12 48 37 40 19 45 41  #\n",
      "13 49 38 31  #  1 23  #\n",
      "14 50 51 32  4 35 24 34\n",
      " # 22 29 33  5 42 25 17\n",
      " 8 20 30 15  6 43 26  #\n",
      " 9 21  # 16  7  2 27  #\n",
      "10 46  #  #  #  3 28 Mv\n",
      "11 47 36 39 18 44  #  #\n",
      "52 次移动  其中52 次指令  总计 52 个步骤\t0:00:04.311959\n",
      "jump(5,7) jump(4,0) 移动 jump(4,1) 移动 移动 移动 jump(7,4) 移动 移动 移动 移动 移动 移动 jump(2,5) 移动 jump(6,4) jump(4,3) 移动 jump(4,3) 移动 jump(6,8) jump(6,3) 移动 移动 移动 移动 移动 jump(5,4) 移动 jump(5,7) 移动 移动 jump(7,4) jump(8,2) jump(5,3) 移动 移动 jump(6,7) 移动 jump(8,5) jump(3,1) 移动 jump(3,8) 移动 jump(6,4) 移动 移动 移动 移动 jump(0,7) jump(4,3)\n",
      "12 48 37 40 19 45 41 Mv\n",
      "13 49 38 31  #  1 23  #\n",
      "14 50 51 32  4 35 24 34\n",
      " # 22 29 33  5 42 25 17\n",
      " 8 20 30 15  6 43 26  #\n",
      " 9 21  # 16  7  2 27  #\n",
      "10 46  #  #  #  3 28 52\n",
      "11 47 36 39 18 44  #  #\n",
      "53 次移动  其中53 次指令  总计 53 个步骤\t0:00:04.500326\n",
      "jump(5,7) jump(4,0) 移动 jump(4,1) 移动 移动 移动 jump(7,4) 移动 移动 移动 移动 移动 移动 jump(2,5) 移动 jump(6,4) jump(4,3) 移动 jump(4,3) 移动 jump(6,8) jump(6,3) 移动 移动 移动 移动 移动 jump(5,4) 移动 jump(5,7) 移动 移动 jump(7,4) jump(8,2) jump(5,3) 移动 移动 jump(6,7) 移动 jump(8,5) jump(3,1) 移动 jump(3,8) 移动 jump(6,4) 移动 移动 移动 移动 jump(0,7) jump(4,3) jump(2,8)\n",
      "41  # 12 48 37 40 19 45\n",
      "23 Mv 13 49 38 31  #  #\n",
      "24 34 14 50 51 32  4 35\n",
      "25 17  # 22 29 33  5 42\n",
      "26  #  8 20 30 15  6 43\n",
      "27 53  9 21  1 16  7  2\n",
      "28 52 10 46  #  #  #  3\n",
      " #  # 11 47 36 39 18 44\n",
      "54 次移动  其中54 次指令  总计 54 个步骤\t0:00:05.284051\n",
      "移动 jump(0,5) 移动 jump(4,1) 移动 移动 移动 jump(7,4) 移动 移动 移动 移动 移动 移动 jump(2,5) 移动 jump(6,4) jump(4,3) 移动 jump(4,3) 移动 jump(6,8) jump(6,3) 移动 移动 移动 移动 移动 jump(5,4) 移动 jump(5,7) 移动 移动 jump(7,4) jump(8,2) jump(5,3) 移动 移动 jump(6,7) 移动 jump(8,5) jump(3,1) 移动 jump(3,8) 移动 jump(6,4) 移动 移动 移动 移动 jump(0,7) jump(4,3) jump(7,0) jump(4,8)\n",
      " # 37 50 49 27 23 44  #\n",
      "52 10 33 29 28 24 45 51\n",
      "53 11 34 30 Mv 25 35 17\n",
      "54  # 39 12 31 26  2 18\n",
      "38 46 40 13 32 19  3  #\n",
      " # 47 41 14  1 20  4 16\n",
      " 6  # 42 15  7 21  5  #\n",
      " # 36  9 48  8 22 43  #\n",
      "55 次移动  其中55 次指令  总计 55 个步骤\t0:00:07.049632\n",
      "移动 jump(6,6) 移动 移动 移动 jump(8,6) jump(0,4) 移动 jump(8,2) jump(2,1) 移动 jump(1,6) 移动 移动 移动 jump(7,4) jump(5,8) 移动 jump(1,2) 移动 移动 移动 移动 移动 移动 移动 jump(5,1) 移动 jump(8,1) 移动 jump(1,7) 移动 jump(5,2) 移动 jump(8,4) jump(5,5) 移动 jump(4,1) jump(7,6) 移动 移动 移动 jump(1,4) 移动 移动 jump(3,5) 移动 jump(2,6) 移动 jump(0,1) jump(1,3) jump(8,7) 移动 移动 jump(7,4)\n",
      "23 44 Mv  # 37 50 49 27\n",
      "24 45 51 52 10 33 29 28\n",
      "25 35 17 53 11 34 30 55\n",
      "26  2 18 54  # 39 12 31\n",
      "19  3  # 38 46 40 13 32\n",
      "20  4 16  # 47 41 14  1\n",
      "21  5  #  6  # 42 15  7\n",
      "22 43  #  # 36  9 48  8\n",
      "56 次移动  其中56 次指令  总计 56 个步骤\t0:00:07.786511\n",
      "jump(1,5) jump(6,6) 移动 移动 移动 jump(8,6) jump(0,4) 移动 jump(8,2) jump(2,1) 移动 jump(1,6) 移动 移动 移动 jump(7,4) jump(5,8) 移动 jump(1,2) 移动 移动 移动 移动 移动 移动 移动 jump(5,1) 移动 jump(8,1) 移动 jump(1,7) 移动 jump(5,2) 移动 jump(8,4) jump(5,5) 移动 jump(4,1) jump(7,6) 移动 移动 移动 jump(1,4) 移动 移动 jump(3,5) 移动 jump(2,6) 移动 jump(0,1) jump(1,3) jump(8,7) 移动 移动 jump(7,4) jump(6,5)\n",
      "27 23 44 56  # 37 50 49\n",
      "28 24 45 51 52 10 33 29\n",
      "55 25 35 17 53 11 34 30\n",
      "31 26  2 18 54  # 39 12\n",
      "32 19  3  # 38 46 40 13\n",
      " 1 20  4 16  # 47 41 14\n",
      " 7 21  5  #  6  # 42 15\n",
      " 8 22 43  # Mv 36  9 48\n",
      "57 次移动  其中57 次指令  总计 57 个步骤\t0:00:08.066623\n",
      "jump(1,4) jump(6,6) 移动 移动 移动 jump(8,6) jump(0,4) 移动 jump(8,2) jump(2,1) 移动 jump(1,6) 移动 移动 移动 jump(7,4) jump(5,8) 移动 jump(1,2) 移动 移动 移动 移动 移动 移动 移动 jump(5,1) 移动 jump(8,1) 移动 jump(1,7) 移动 jump(5,2) 移动 jump(8,4) jump(5,5) 移动 jump(4,1) jump(7,6) 移动 移动 移动 jump(1,4) 移动 移动 jump(3,5) 移动 jump(2,6) 移动 jump(0,1) jump(1,3) jump(8,7) 移动 移动 jump(7,4) jump(6,5) jump(7,7)\n",
      "47 41 14  1 20  4 16  #\n",
      " # 42 15  7 21  5  #  6\n",
      "36  9 48  8 22 43  # 57\n",
      "37 50 49 27 23 44 56 Mv\n",
      "10 33 29 28 24 45 51 52\n",
      "11 34 30 55 25 35 17 53\n",
      " # 39 12 31 26  2 18 54\n",
      "46 40 13 32 19  3  # 38\n",
      "58 次移动  其中58 次指令  总计 58 个步骤\t0:00:08.824975\n",
      "jump(4,1) jump(6,6) 移动 移动 移动 jump(8,6) jump(0,4) 移动 jump(8,2) jump(2,1) 移动 jump(1,6) 移动 移动 移动 jump(7,4) jump(5,8) 移动 jump(1,2) 移动 移动 移动 移动 移动 移动 移动 jump(5,1) 移动 jump(8,1) 移动 jump(1,7) 移动 jump(5,2) 移动 jump(8,4) jump(5,5) 移动 jump(4,1) jump(7,6) 移动 移动 移动 jump(1,4) 移动 移动 jump(3,5) 移动 jump(2,6) 移动 jump(0,1) jump(1,3) jump(8,7) 移动 移动 jump(7,4) jump(6,5) jump(7,7) 移动\n",
      "50 49 27 23 44 56 58 37\n",
      "33 29 28 24 45 51 52 10\n",
      "34 30 55 25 35 17 53 11\n",
      "39 12 31 26  2 18 54  #\n",
      "40 13 32 19  3  # 38 46\n",
      "41 14  1 20  4 16 Mv 47\n",
      "42 15  7 21  5  #  6  #\n",
      " 9 48  8 22 43  # 57 36\n",
      "59 次移动  其中59 次指令  总计 59 个步骤\t0:00:11.595832\n",
      "jump(1,2) jump(6,6) 移动 移动 移动 jump(8,6) jump(0,4) 移动 jump(8,2) jump(2,1) 移动 jump(1,6) 移动 移动 移动 jump(7,4) jump(5,8) 移动 jump(1,2) 移动 移动 移动 移动 移动 移动 移动 jump(5,1) 移动 jump(8,1) 移动 jump(1,7) 移动 jump(5,2) 移动 jump(8,4) jump(5,5) 移动 jump(4,1) jump(7,6) 移动 移动 移动 jump(1,4) 移动 移动 jump(3,5) 移动 jump(2,6) 移动 jump(0,1) jump(1,3) jump(8,7) 移动 移动 jump(7,4) jump(6,5) jump(7,7) 移动 jump(5,0)\n",
      "58 37 50 49 27 23 44 56\n",
      "52 10 33 29 28 24 45 51\n",
      "53 11 34 30 55 25 35 17\n",
      "54  # 39 12 31 26  2 18\n",
      "38 46 40 13 32 19  3  #\n",
      " # 47 41 14  1 20  4 16\n",
      " 6  # 42 15  7 21  5 59\n",
      "57 36  9 48  8 22 43 Mv\n",
      "60 次移动  其中60 次指令  总计 60 个步骤\t0:00:13.493174\n",
      "移动 jump(6,6) 移动 移动 移动 jump(8,6) jump(0,4) 移动 jump(8,2) jump(2,1) 移动 jump(1,6) 移动 移动 移动 jump(7,4) jump(5,8) jump(1,0) jump(1,2) 移动 移动 移动 移动 移动 移动 移动 jump(5,1) 移动 jump(8,1) 移动 jump(1,7) 移动 jump(5,2) 移动 jump(8,4) jump(5,5) 移动 jump(4,1) jump(7,6) 移动 移动 移动 jump(1,4) 移动 移动 jump(3,5) 移动 jump(2,6) 移动 jump(0,1) jump(1,3) jump(8,7) 移动 移动 jump(7,4) jump(6,5) jump(7,7) 移动 jump(6,1) 移动\n",
      " 8 17 45 38  4 41 29 24\n",
      " 9 18 52 31  5 42 30 25\n",
      "10 19 53 32  6 43  # 26\n",
      "11 20 54 33 40 21 60 27\n",
      "22 47 55 34 57 50 12 56\n",
      "23 48 58 35  1 39 13 51\n",
      "Mv 49 59 36  2 28 14 44\n",
      " 7 16 46 37  3  # 15  #\n",
      "61 次移动  其中61 次指令  总计 61 个步骤\t0:00:16.567568\n",
      "移动 移动 移动 移动 移动 移动 jump(5,4) 移动 移动 移动 移动 jump(1,2) 移动 移动 jump(1,0) jump(0,5) 移动 移动 移动 移动 jump(0,4) jump(1,5) 移动 jump(3,1) 移动 移动 移动 jump(3,2) jump(2,7) 移动 jump(0,3) 移动 移动 移动 移动 移动 移动 移动 jump(5,6) jump(6,1) jump(5,7) 移动 移动 jump(4,6) jump(2,5) jump(7,8) jump(5,1) 移动 移动 jump(6,4) jump(1,6) jump(4,5) 移动 移动 移动 jump(8,3) jump(0,3) jump(1,2) 移动 jump(5,4) jump(3,6)\n",
      "21  1 16  7  2 27 53  9\n",
      "46 57 56 58  3 28 52 10\n",
      "47 36 39 18 44 Mv 60 11\n",
      "48 37 40 19 45 41 61 12\n",
      "49 38 31 55  # 23 54 13\n",
      "50 51 32  4 35 24 34 14\n",
      "22 29 33  5 42 25 17  #\n",
      "20 30 15  6 43 26 59  8\n",
      "62 次移动  其中62 次指令  总计 62 个步骤\t0:00:20.552610\n",
      "jump(4,3) jump(0,5) 移动 jump(4,1) 移动 移动 移动 jump(7,4) 移动 移动 移动 移动 移动 移动 jump(2,5) 移动 jump(6,4) jump(4,3) 移动 jump(4,3) 移动 jump(6,8) jump(6,3) 移动 移动 移动 移动 移动 jump(5,4) 移动 jump(5,7) 移动 移动 jump(7,4) jump(8,2) jump(5,3) 移动 移动 jump(6,7) 移动 jump(8,5) jump(3,1) 移动 jump(3,8) 移动 jump(6,4) 移动 移动 移动 移动 jump(0,7) jump(4,3) jump(7,0) jump(4,8) jump(8,3) jump(5,1) jump(8,1) jump(8,6) jump(6,5) jump(3,0) jump(1,0) jump(7,1)\n",
      "58 37 50 49 27 23 44 56\n",
      "52 10 33 29 28 24 45 51\n",
      "53 11 34 30 55 25 35 17\n",
      "54 62 39 12 31 26  2 18\n",
      "38 46 40 13 32 19  3 Mv\n",
      " # 47 41 14  1 20  4 16\n",
      " 6 61 42 15  7 21  5 59\n",
      "57 36  9 48  8 22 43 60\n",
      "63 次移动  其中63 次指令  总计 63 个步骤\t0:00:24.399021\n",
      "移动 jump(6,6) 移动 移动 移动 jump(8,6) jump(0,4) 移动 jump(8,2) jump(2,1) 移动 jump(1,6) 移动 移动 移动 jump(7,4) jump(5,8) 移动 jump(1,2) 移动 移动 移动 移动 移动 移动 移动 jump(5,1) 移动 jump(8,1) jump(1,0) jump(1,7) 移动 jump(5,2) 移动 jump(8,4) jump(5,5) 移动 jump(4,1) jump(7,6) 移动 移动 移动 jump(1,4) jump(1,8) 移动 jump(3,5) 移动 jump(2,6) 移动 jump(0,1) jump(1,3) jump(8,7) 移动 移动 jump(7,4) jump(6,5) jump(7,7) 移动 jump(6,1) 移动 jump(7,6) jump(5,8) jump(1,2)\n",
      "46 40 13 32 19  3 63 38\n",
      "47 41 14  1 20  4 16 Mv\n",
      "61 42 15  7 21  5 59  6\n",
      "36  9 48  8 22 43 60 57\n",
      "37 50 49 27 23 44 56 58\n",
      "10 33 29 28 24 45 51 52\n",
      "11 34 30 55 25 35 17 53\n",
      "62 39 12 31 26  2 18 54\n",
      "64 次移动  其中64 次指令  总计 64 个步骤\t0:00:32.163086\n",
      "jump(5,1) jump(6,6) 移动 移动 移动 jump(8,6) jump(0,4) 移动 jump(8,2) jump(2,1) 移动 jump(1,6) 移动 移动 移动 jump(7,4) jump(5,8) 移动 jump(1,2) 移动 移动 移动 移动 移动 移动 移动 jump(5,1) 移动 jump(8,1) 移动 jump(1,7) 移动 jump(5,2) jump(1,0) jump(8,4) jump(5,5) jump(1,0) jump(4,1) jump(7,6) 移动 移动 移动 jump(1,4) 移动 移动 jump(3,5) 移动 jump(2,6) 移动 jump(0,1) jump(1,3) jump(8,7) 移动 移动 jump(7,4) jump(6,5) jump(7,7) 移动 jump(6,1) 移动 jump(7,6) jump(5,8) jump(1,2) jump(1,7)\n"
     ]
    }
   ],
   "source": [
    "test_mow_turn_jump()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.10"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
